《Effective C++》条款37

发布时间:2023年12月18日

绝不重新定义继承而来的缺省参数值

int x = 0;
class A
{
public:
	virtual int value(int x = 1)
	{
		return x;
	}
};
class B:public A
{
public:
	virtual int value(int x = 2)
	{
		return x;
	}
};

我们预期输出的结果是2,但是实际输出是1。那是因为虽然函数是动态绑定的,但是缺省参数不是。因为如果缺省参数是动态绑定,编译器就必须有某种办法在运行期为virtual函数决定适当的参数缺省值。影响效率,所以编译器索性不干。所以缺省参数都是静态绑定的。

解决方案: (利用NVI手法)

class A
{
public:
	int Value(int x = 1)
	{
		return value(x);
	}
private:
	virtual int value(int x)
	{
		return x;
	}
};
class B:public A
{
public:
	int Value(int x = 2)
	{
		return value(x);
	}
private:
	virtual int value(int x)
	{
		return x;
	}
};

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

文章来源:https://blog.csdn.net/qq_64863535/article/details/135070858
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。