C++ 需要在substant.h文件中重新声明重写的函数

C++ 需要在substant.h文件中重新声明重写的函数,c++,inheritance,overriding,C++,Inheritance,Overriding,我有一个基类B,在B.h中我声明了虚函数vf()和正则函数f() 我有一个子类D,希望在其中重写vf()。我已经在d.cpp中实现了vf() 我必须在d.h中声明vf()吗?(签名完全相同) 如果不重写函数f(),是否还必须在d.h中重新声明f() 成员函数声明和定义是齐头并进的。除非声明成员函数,否则不能定义该函数。若您声明了成员函数,但并没有定义它,那个么在链接时很可能会看到未定义的函数错误。函数声明的virtual方面是正交的 说到你的问题 我必须在d.h中声明vf()吗?(签名完全相同)

我有一个基类B,在B.h中我声明了虚函数vf()和正则函数f()

我有一个子类D,希望在其中重写vf()。我已经在d.cpp中实现了vf()

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

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


  • 成员函数声明和定义是齐头并进的。除非声明成员函数,否则不能定义该函数。若您声明了成员函数,但并没有定义它,那个么在链接时很可能会看到未定义的函数错误。函数声明的
    virtual
    方面是正交的

    说到你的问题

  • 我必须在d.h中声明vf()吗?(签名完全相同)
  • 如果不重写函数f(),是否还必须在d.h中重新声明f()

  • 不。

    简短的回答是:是的。你能解释一下原因吗?既然vf是在B中声明的,那么为什么后代必须为它想要覆盖的所有内容创建一个原型呢?(我还扩展了我的问题)你是否在寻找比“因为标准这么说”更深刻的答案?我问为什么,因为我得到了奇怪的编译器结果。我想我一定错过了一些概念。(即,如果已经声明,为什么要重新声明完全相同的内容)?但是我想如果“因为标准这么说”是原因,那么就在这里发布“编译器结果”和导致它们的代码。此外,您根本无法重写
    f()
    ,因为它不是虚拟的。只能引入与旧函数同名的新函数。是否定义而不声明?如果我在类中定义内联函数,我就没有(至少是显式的)声明了…@Aconcagua,内联定义也是一种声明。编译器对在d.cpp中重写的函数使用声明,而在b.h中使用声明,这有意义吗?是否有我遗漏的常识性原因——如果它已经在基类中声明,为什么要重新声明?(抱歉,如果这看起来很迟钝-我只需要一个明确的原因,这样我就不会再犯同样的错误了)@TSG从编译器的角度来看,这很容易做到。标准委员会可能确实做出了不同的决定,以明确(对于派生类
    D
    的用户而言)这样的事情正在进行。类似的推理可能是:如果您在
    D
    中重载(而不是重写)了
    B
    中的函数,并且仍然希望继承的函数可用,那么您需要包括(在D.h中,在类中):
    使用B::vf。。。同样的意图新的(C++11)override关键字..@TSG,如果未声明
    virtual
    函数,我怀疑虚拟表的构造将是一个问题。