先看个编译多继承带来的编译错误
/************************************************************************* > File Name: muti_inherit.cpp > Author: guoqingyao > Mail: stepbystepto@163.com > Created Time: 2016年08月11日 星期四 12时38分35秒 ************************************************************************/ #include<iostream> using namespace std; class A { public: int a; }; class B : public A { }; class C : public A { }; class D : public B, public C { }; int main() { D d; d.a = 1; return 0; }编译错误
dotheright@dotheright:~/mylovelycodes/cpp/base/9$ g++ muti_inherit.cpp muti_inherit.cpp: In function ‘int main()’: muti_inherit.cpp:31:4: error: request for member ‘a’ is ambiguous d.a = 1; ^ muti_inherit.cpp:13:6: note: candidates are: int A::a int a; ^ muti_inherit.cpp:13:6: note: int A::a 这里出现的错误是d.a 有二义性,这时候我们就要找二义分别是指的什么? 变量a的一种继承关系
Created with Raphaël 2.1.0 D D B B A A 继承于 继承于变量a的另一种继承关系
Created with Raphaël 2.1.0 D D C C A A 继承于 继承于A 由两份copy 所以会有二义性,消除二义性就是A只留一份,需要用到虚继承
/************************************************************************* > File Name: muti_inherit.cpp > Author: guoqingyao > Mail: stepbystepto@163.com > Created Time: 2016年08月11日 星期四 12时38分35秒 ************************************************************************/ #include<iostream> using namespace std; class A { public: int a; }; class B :virtual public A { }; class C :virtual public A { }; class D : public B, public C { }; int main() { D d; d.a = 1; return 0; }