多继承的二义性问题
- 在同名隐藏示例中,如果我们去掉派生类中print函数的定义,仍然在主函数中通过对象调用print函数呢?
- 显然,调用后程序会报错:request for member ‘print’ is ambiguous。译为:成员“print”的请求不明确。这里出现了程序的二义性问题,因为派生类多继承于两个基类,两个基类中都有同名函数print,所以编译出现错误。
- 下面我们重点看这个图的例子,理解派生类C与A,B,C的关系及它的成员构成图,并引出图对应的多继承同名隐藏示例。
#include <iostream>
using namespace std;
class A{
public:
int a;
void fun0()
{
cout<<"A function is called."<<endl;
}
A(){ cout<<"construct A"<<endl; }
~A(){ cout<<"destruct A"<<endl; }
};
class B1:public A{
public:
int b1;
B1(){ cout<<"construct B1"<<endl; }
~B1(){ cout<<"destruct B1"<<endl; }
};
class B2:public A{
public:
int b2;
B2(){ cout<<"construct B2"<<endl; }
~B2(){ cout<<"destruct B2"<<endl; }
};
class C:public B1,public B2{
public:
int b1;
C(){ cout<<"construct C"<<endl; }
~C(){ cout<<"destruct C"<<endl; }
void fun()
{
cout<<"C function is called."<<endl;
}
};
int main()
{
C c;
c.B1::a=10;
c.B2::a=20;
c.fun();
c.B1::fun0(); //作用域运算符解决二义性问题
c.B2::fun0();
return 0;
}
运行结果: