我创建了一个抽象基类,它有一个带有默认参数的纯虚方法。
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;
}
产量:
Deriv::f(1)
关于c++ - 良好做法 : Default arguments for pure virtual method,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12139786/