effective C++笔记之条款26:当心潜在的二义性

三种可能的情况

1.类中构造函数与重载转换运算符间的二义性,如下所示:

class B;
class A
{
public:
	A(const B& b) {  cout << "A()" << endl; }
private:
	int data;
};

class B
{
public:
	B():data(0) {}
	operator A() const;
private:
	int data;
};
void ff(const A& a)
{
	cout << "ff" << endl;
}

int main()
{
	B b;
	ff(b);  //错误,会产生二义性
	system("pause");
	return 0;
}

产生二义性的原因是因为有两种方法来实现由B转换为A,一种方法是调用类A的构造函数,另一种是调用类B里自定义的转换运算符。这两个途径都一样可行,所以编译器拒绝从他们中选择一个。

2.  函数调用中也存在二义性

void ff(int a)
{
	cout << "ff(int)" << endl;
}

void ff(char a)
{
	cout << "ff(char)" << endl;
}

int main()
{
	double a = 10.0;
	ff(a); //错误。二义性。要想调用,需ff(static_cast<int>(a));
	return 0;
}

该函数调用的二义性来源于C++语言的标准转换。a转换成int和char都可以,所以编译器不会通过。


3.多继承中存在的二义性

class Base1
{
public:
	void dolt(void) { cout << "Base1::dolt()" << endl; }
};

class Base2
{
public:
	void dolt(void) { cout << "Base2::dolt()" << endl; }
};

class Derived : public Base1, public Base2
{
	
};

int main()
{
	Derived a;
a.dolt(); //错误,二义性。要想成功调用,需指明函数所在的基类,如//a.Base1::dolt();
return 0;
}




评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值