[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;
}

编译后会出现以下编译错误:
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;
}

 

posted on 2009-06-11 15:34  笔记  阅读(2388)  评论(0编辑  收藏  举报

导航