[C++ rudiment]多重继承中二义性错误的解决:虚基类
C++中允许多重继承,看以下例子:
#include <iostream>
using namespace std;
/*
继承关系说明:A是B和C的基类,B和C是D的基类
*/
class A
{
public:
int a;
};
class B:public A
{
public:
int b;
};
class C:public A
{
public:
int c;
};
class D:public B,public C
{
public:
int d;
};
int main()
{
D d;
d.a = 100;
return 0;
}
using namespace std;
/*
继承关系说明:A是B和C的基类,B和C是D的基类
*/
class A
{
public:
int a;
};
class B:public A
{
public:
int b;
};
class C:public A
{
public:
int c;
};
class D:public B,public C
{
public:
int d;
};
int main()
{
D d;
d.a = 100;
return 0;
}
编译后会出现以下编译错误:
error C2385: ambiguous access of 'a'。
究其原因,因为A是D的间接基类,通过D访问A的数据成员有两条路可走,一是D->B->A,另外一条是:D->C->A.所以导致了二义性。
解决:
这可以通过虚基类来解决二义性问题,如果采用虚基类方式来定义派生类,则在创建派生类对象时,类层次结构中某个虚基类的成员只出现一次。即基类的一个副本被所有的派生类对象所共享。修改代码如下后即可解决:
#include <iostream>
using namespace std;
/*
继承关系说明:A是B和C的基类,B和C是D的基类
*/
class A
{
public:
int a;
};
class B:public virtual A //A是B的虚基类
{
public:
int b;
};
class C:public virtual A //A是C的虚基类
{
public:
int c;
};
class D:public B,public C
{
public:
int d;
};
int main()
{
D d;
d.a = 100;
return 0;
}
using namespace std;
/*
继承关系说明:A是B和C的基类,B和C是D的基类
*/
class A
{
public:
int a;
};
class B:public virtual A //A是B的虚基类
{
public:
int b;
};
class C:public virtual A //A是C的虚基类
{
public:
int c;
};
class D:public B,public C
{
public:
int d;
};
int main()
{
D d;
d.a = 100;
return 0;
}
我没有什么雄心壮志,我只想给自己和关心自己的家人和朋友一个交代,仅此而已。