菱形继承问题样例:
#include <iostream> using namespace std; class A { public: int x=4; virtual int getx() { return x; } }; class B:public A{}; class C:public A{}; class D:public B,public C{}; int main() { D d; //以下代码不会被任何编译器通过,因为存在菱形继承问题:不知道是调用B的getx函数,还是调用C的getx函数 //cout<<d.getx()<<endl; //指定调用B的getx函数 cout<<d.B::getx()<<endl; }
采用虚继承解决菱形继承问题:菱形虚继承
#include <iostream> using namespace std; class A { public: int x=4; virtual int getx() { return x; } }; class B:virtual public A {}; class C:virtual public A {}; class D:public B,public C {}; int main() { D d; cout<<d.getx()<<endl; }
内存布局图: