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

 

你可能感兴趣的:(C++)