#include<iostream>
#include<stdio.h>
using namespace std;
/************************************************************************
* 二义性问题
************************************************************************/
//基类
class CBase
{
int a;
public:
int x;
void func();
};
//派生类1
class CDerive1:public CBase //可以添加virtual虚基类
{
int b;
public:
int y;
void func1();
};
//派生类2
class CDerive2:public CBase//可以添加virtual虚基类
{
int c;
public:
int z;
void func2();
};
//子派生类
class CDerive12:CDerive1,CDerive2
{
int d;
public:
int yz;
int func12()
{
//x=10; //error C2385: 'CDerived12::x' is ambiguous
//func(); //error C2385: 'CDerived12::func' is ambiguous
CDerive1::x=10;
CDerive1::func();
return 0;
}
};
int main()
{
CDerive12 obj;
return 0;
}
解决二义性问题的方法:
1.利用范围运算符指明所要调用的成员的类属范围;
2.在派生类中重新定义一个与基类中同名的成员,使该成员隐蔽基类的同名成员;
3.将公共基类说明为
虚基类
,避免在派生类中保留多个基类的备份,而只保存一个实例。