一、概念
砖石继承即菱形继承
菱形继承即多个类继承了同一个公共基类,而这些派生类又同时被一个类继承
即B和C类共同继承了A类,同时C类又多重继承了B类和C类。
例子:
class A{
//基类A
private:
int a;
int b;
public:
A();
int sum(){
return a+b};
}
class B :public A{ };
class C :public A{ };
class D :public B,public C{ };
二、砖石继承的问题:
B类和C类通过public继承了A类,同时D类通过多重继承的机制继承了B类和C类,也就意味着D类中有两份A类的成员(数据和方法),D类的对象有两份A类的子对象。
main()中调用fun()时,编译器不知道是调用B的fun()还是C的fun(),所以FUN方法的调用不明确,编译报错
三、解决方案
1、使用域限定来明确需要使用的函数
int main()
{
D d;
d.A::fun();
d.B::fun();
d.C::fun();
return 0;
}
2、虚函数
使用关键字:virtual
class C : virtual public A{ };
class B: virtual public A{ };
四、虚函数
请看后续更新文章