在不知道不同类的角色的情况下,很难说,但是如果A和F是接口(很可能是这种情况),那么给定一个A*,询问对象是否也支持接口的正确方法F是dynamic_cast<F*>。如果支持,这将为您提供指向F接口的指针,否则为空指针。
除此之外,您可能会反映接口是否F扩展了A接口,或者它是否完全不相关。如果它是一个扩展,那么F应该可能来自A; 在创建一个已知实现扩展接口的对象时,将其地址分配给F*,并避免所有未来的强制转换。(一般来说,不要分配给 anA*直到你到达一些指向的对象将不会实现的点F。)所以你最终会得到类似的东西:
// interfaces...
class A {};
class F : public virtual A {};
// implementations of A...
class C : public virtual A {};
class B : public virtual A {};
// implementations of F (and also A, of course)
class E : public C, public virtual F {};
class D : public B, public virtual F {};
请注意,从接口派生时,将派生设为虚拟通常是个好主意。(在这种情况下,所有 的派生都需要它A。但由于相同的模式可以在另一个层次上重复,一些新类扩展了 的接口F,因此通常采用以下规则更简单:从接口派生是虚拟的。)
如果F真的与 无关A,那么您甚至可能会问一个类在做什么来实现两者。A或者,如果某些(许多?)实现也实现是有意义的F,您可以考虑提供F对以下接口的访问A:比如虚函数F* A::getF() { return NULL; };也实现的类F将使用类似F* E::getF() { return this; }.