我创建了一个抽象基类,它有一个带默认参数的纯虚方法。
class Base {
...
virtual someMethod(const SomeStruct& t = 0) = 0;
...
}
class Derived : public Base {
...
virtual someMethod(const SomeStruct& t = 0);
...
}
所以我想知道将默认参数设置为纯虚拟方法并将整体设置为虚拟方法是否是一个好习惯?
实际上,您的代码是默认参数最糟糕的使用模式之一,因为它涉及继承和多态行为。我支持查看相关 Scott Meyers 技巧的建议,但这里有一个简短的概述:
在多态调用的情况下,根据静态类型的声明使用默认参数,而不是动态类型。这是合乎逻辑的,因为运行时不知道默认参数,但打破了有关多态行为的任何合理假设。例如,
#include <cstdio>
class Base
{
public:
virtual void f(int a = 1)
{
printf("Base::f(%d)\n", a);
}
};
class Deriv : public Base
{
public:
virtual void f(int a = 2)
{
printf("Deriv::f(%d)\n", a);
}
};
int main()
{
Base* a = new Deriv();
a->f();
delete a;
return 0;
}
yields:
Deriv::f(1)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)