如何看待多重继承?
class A { public: void test(); }; class B { public: int test(); }; class C :public A, public B {}; int main() { C c; c.test(); // 不明确 }
可能会产生歧义,调用不明确。
为了解决,你可以这样:
c.A::test();
菱形继承的问题如何解决??
利用虚继承即可:
class A {}; class B:virtual public A {}; class C :virtual public A {}; class D :public B, public C {};
使用virtual继承的那些classes所产生的对象往往比使用non-virtual继承的兄弟们体积大,访问virtual base classes的成员变量时,也比访问non-virtual base classes的成员变量速度慢。
所以,尽量别使用virtual继承,或者不要在virtual base classes中放数据,这样就不用担心这些classes身上的初始化和赋值所带来的诡异事情了。因为当一个新的derived class加入继承体系中,他必须承担其virtual bases的初始化责任。
多继承的用途:
当出现将“public继承自某接口”和“将private继承自某实现”结合在一起时。
总结:
1.多重继承比单一继承复杂。可能导致二义性,以及对virtual继承的需要。
2.virtual继承会增加大小、速度、初始化和赋值复杂度等等成本。如果virtual base classes不带任何数据,是个不错的情况。
3.多重继承的确有正当用途。?