如果我声明一个基类(或接口类)并为它的一个或多个参数指定默认值,派生类是否必须指定相同的默认值,如果没有,哪些默认值将在派生类中显示?
附录:我也感兴趣的是如何在不同的编译器之间处理这个问题,以及在这个场景中关于“推荐”实践的任何输入。
发布于 2010-08-21 02:17:52
这是Herb Sutter早期Guru of the Week帖子中的一个主题。
他在这个问题上说的第一件事就是不要那样做。
更详细地说,是的,您可以指定不同的默认参数。它们的工作方式与虚拟函数不同。在对象的动态类型上调用虚函数,而默认参数值基于静态类型。
给定的
class A {
virtual void foo(int i = 1) { cout << "A::foo" << i << endl; }
};
class B: public A {
virtual void foo(int i = 2) { cout << "B::foo" << i << endl; }
};
void test() {
A a;
B b;
A* ap = &b;
a.foo();
b.foo();
ap->foo();
}
你应该得到A::foo1 B::foo2 B::foo1
发布于 2017-08-05 10:51:05
正如其他答案所详细描述的那样,这是个坏主意。然而,由于没有人提到简单而有效的解决方案,这里是:将参数转换为struct,然后您就可以拥有struct成员的默认值!
所以不是,
//bad idea
virtual method1(int x = 0, int y = 0, int z = 0)
这样做,
//good idea
struct Param1 {
int x = 0, y = 0, z = 0;
};
virtual method1(const Param1& p)
发布于 2010-08-21 02:22:46
正如您从其他答案中看到的,这是一个复杂的主题。而不是试图这样做或了解它做了什么(如果你现在必须问,维护者将不得不在一年后询问或查找它)。
相反,应使用默认参数在基类中创建一个公共非虚函数。然后,它调用一个私有或受保护的虚函数,该函数没有默认参数,并根据需要在子类中被覆盖。然后你就不必担心它如何工作的细节了,代码是非常明显的。
https://stackoverflow.com/questions/3533589
复制相似问题