在不知道不同类的角色的情况下,很难说,但是如果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; }
.