【问题标题】:Need to redeclare overridden functions in descendant .h file需要在后代 .h 文件中重新声明被覆盖的函数
【发布时间】:2018-01-15 18:06:28
【问题描述】:

我有一个基类 B,在 b.h 中我声明了虚函数 vf() 和常规函数 f()。

我有一个后代类 D,我希望在其中覆盖 vf()。我已经在 d.cpp 中实现了 vf()

  1. 我必须在 d.h 中声明 vf() 吗? (签名完全相同)

  2. 如果我不重写函数 f(),我是否还必须在 d.h 中重新声明 f()?

【问题讨论】:

  • 简短的回答:是的。
  • 您能解释一下原因吗?既然 vf 是在 B 中声明的,为什么后代必须为它想要覆盖的所有东西创建一个原型? (我也扩展了我的问题)
  • 您是否正在寻找比“因为标准这么说”更深入的答案?
  • 我问为什么,因为我得到了奇怪的编译器结果。我想我一定错过了一些概念。 (即如果已经声明,为什么要重新声明完全相同的东西)?但我想如果“因为标准这么说”是原因,那么可以
  • 然后在此处发布“编译器结果”和导致它们的代码。你也不能覆盖f(),因为它不是虚拟的。您只能引入具有相同名称的新功能,该功能将隐藏旧功能。

标签: c++ inheritance overriding


【解决方案1】:

成员函数声明和定义齐头并进。除非声明,否则您不能定义成员函数。如果您声明成员函数但未定义它,您可能会在链接时看到未定义函数错误。函数声明的virtual 方面是正交的。

回答你的问题,

  1. 我必须在 d.h 中声明 vf() 吗? (签名完全相同)

是的。

  1. 如果我不重写函数 f(),我是否还必须在 d.h 中重新声明 f()?

没有。

【讨论】:

  • 没有声明的定义?如果我在类中定义内联函数,我将不再有(至少是显式的)声明......
  • @Aconcagua,内联定义也是声明。
  • 编译器使用 d.cpp 中重写的函数的声明和 b.h 中的声明是否没有意义?是否有我遗漏的常识性原因 - 如果它已经在基类中声明,为什么要重新声明? (对不起,如果这看起来很迟钝 - 我只需要一个明确的理由,所以我不会再犯同样的错误)
  • @TSG 从编译器的角度来看,这很容易实现。标准委员会可能确实做出了不同的决定,以使其非常明显(对于您的派生类D 的用户)这样的事情正在进行中。类似的推理可能:如果您在 D 中重载(而不是覆盖)来自 B 的函数并且仍然希望继承的函数可用,则需要包含(在 d.h 中,在类中):using B::vf;...新的(C++ 11)覆盖关键字再次相同的意图..
  • @TSG,如果 virtual 函数在未声明的情况下定义,我怀疑虚拟表的构建将是一个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-13
  • 1970-01-01
  • 2021-03-09
  • 2019-08-21
  • 1970-01-01
相关资源
最近更新 更多