C++支持多重继承,若如图所示,BC继承于A,D继承于BC。
若BC继承于A属于public,当创建D时,会创建2个A和1个BCD。第一会浪费空间(创建了2个A),第二,当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的成员函数不会产生二义性。