二义性问题
1.在继承时,基类之间、或基类与派生类之间发生成员同名时,将出现对成员访问的不确定性——同名二义性。
2.当派生类从多个基类派生,而这些基类又从同一个基类派生,则在访问此共同基类中的成员时,将产生另一种不确定性——路径二义性。
同名二义性
同名隐藏规则——解决同名二义的方法
当派生类与基类有同名成员时,派生类中的成员将屏蔽基类中的同名成员。
若未特别指明,则通过派生类对象使用的都是派生类中的同名成员;
如要通过派生类对象访问基类中被屏蔽的同名成员,应使用基类名限定(::)。
多继承同名隐藏举例
//多继承同名隐藏举例
#include <iostream>
using namespace std;
class B1//声明基类B1
{
public:
int nV;
void fun() {cout<<"Member of B1"<<endl;}
};
class B2//声明基类B2
{
public:
int nV;
void fun() {cout<<"Member of B2"<<endl;}
};
class D1: public B1, public B2
{
public:
int nV;//同名数据成员
void fun(){cout<<"Member of D1"<<endl;} //同名函数成员
};
void main()
{
D1 d1;
//用“对象名.成员名”访问子类成员。
d1.nV=1;
d1.fun();
//加“作用域分辨符标识”, 可访问基类被屏蔽的成员
d1.B1::nV=2;
d1.B1::fun();
d1.B2::nV=3;
d1.B2::fun();
}
同名二义性的解决方法