首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >虚函数可以有默认参数吗?

虚函数可以有默认参数吗?
EN

Stack Overflow用户
提问于 2010-08-21 02:04:26
回答 4查看 76.2K关注 0票数 186

如果我声明一个基类(或接口类)并为它的一个或多个参数指定默认值,派生类是否必须指定相同的默认值,如果没有,哪些默认值将在派生类中显示?

附录:我也感兴趣的是如何在不同的编译器之间处理这个问题,以及在这个场景中关于“推荐”实践的任何输入。

EN

回答 4

Stack Overflow用户

发布于 2010-08-21 02:17:52

这是Herb Sutter早期Guru of the Week帖子中的一个主题。

他在这个问题上说的第一件事就是不要那样做。

更详细地说,是的,您可以指定不同的默认参数。它们的工作方式与虚拟函数不同。在对象的动态类型上调用虚函数,而默认参数值基于静态类型。

给定的

代码语言:javascript
复制
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

票数 44
EN

Stack Overflow用户

发布于 2017-08-05 10:51:05

正如其他答案所详细描述的那样,这是个坏主意。然而,由于没有人提到简单而有效的解决方案,这里是:将参数转换为struct,然后您就可以拥有struct成员的默认值!

所以不是,

代码语言:javascript
复制
//bad idea
virtual method1(int x = 0, int y = 0, int z = 0)

这样做,

代码语言:javascript
复制
//good idea
struct Param1 {
  int x = 0, y = 0, z = 0;
};
virtual method1(const Param1& p)
票数 7
EN

Stack Overflow用户

发布于 2010-08-21 02:22:46

正如您从其他答案中看到的,这是一个复杂的主题。而不是试图这样做或了解它做了什么(如果你现在必须问,维护者将不得不在一年后询问或查找它)。

相反,应使用默认参数在基类中创建一个公共非虚函数。然后,它调用一个私有或受保护的虚函数,该函数没有默认参数,并根据需要在子类中被覆盖。然后你就不必担心它如何工作的细节了,代码是非常明显的。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3533589

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档