先看个编译多继承带来的编译错误
/*************************************************************************
> 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的一种继承关系
变量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;
}