C++ 二义性问题

本文探讨了C++中的二义性问题,包括同名二义性和路径二义性。同名二义性可通过类名限定或同名覆盖解决,而路径二义性则通过使用虚基类来解决。在多继承情况下,虚基类确保了对最远基类成员的唯一访问。此外,文章还介绍了构造函数的调用顺序以及二义性在默认参数、重载函数和用户自定义类型转换中的体现。
摘要由CSDN通过智能技术生成

 二义性问题

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();
}



同名二义性的解决方法

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值