C++虚继承
C++支持多重继承,若如图所示,BC继承于A,D继承于BC。

若BC继承于A属于public,当创建D时,会创建2个A和1个BCD。当D调用A的成员函数(包括虚函数)时,会产生二义性,不知道应该调用哪个A。
1 class A 2 { 3 public: 4 A() { cout << "constructor A" << endl; } 5 ~A() { cout << "destructor A" << endl; } 6 void show() { cout << "A" << endl; } 7 virtual void test() { cout << "A test" << endl; } 8 }; 9 10 class B: public A 11 { 12 public: 13 B() { cout << "constructor B" << endl; } 14 ~B() { cout << "destructor B" << endl; } 15 }; 16 17 class C: public A 18 { 19 public: 20 C() { cout << "constructor C" << endl; } 21 ~C() { cout << "destructor C" << endl; } 22 }; 23 24 class D: public B, public C 25 { 26 public: 27 D() { cout << "constructor D" << endl; } 28 ~D() { cout << "destructor D" << endl; } 29 }; 30 31 int main() 32 { 33 D d; 34 d.test(); // 报错,d.test() 不明确 35 d.show(); // 报错,d.show() 不明确 36 37 return 0; 38 }

若将BC继承A改为virtual public,那么创建D时,只会创建1个ADCD,且调用A的成员函数不会产生二义性。

扩展:使用 virtual 继承的那些 classes 所产生的对象往往比使用 non-virtual 继承的体积大,访问 virtual base classes 的成员变量时,也比访问 non-virtual base classes 的成员变量速度慢。你得为 virtual 继承付出代价。(来自EFFECTIVE C++)
忠告:第一,非必要不使用 virtual bases。平常使用 non-virtual 继承。第二,如果必须使用 virtual base classes ,尽可能避免在其中放置数据。这样就不需要担心这些 classes 初始化(和赋值)所带来的诡异事情了。(来自EFFECTIVE C++)

浙公网安备 33010602011771号