为什么我们需要将函数声明复制并粘贴到继承的类头中 这是C++的。

为什么我们需要将函数声明复制并粘贴到继承的类头中 这是C++的。,c++,class,inheritance,coding-style,C++,Class,Inheritance,Coding Style,通常我们在头文件中有函数声明,在源文件中有定义。 假设我们有一个带有一些函数的类a: //< A.hpp class A { public: virtual funcA(); virtual funcB(); } /

通常我们在头文件中有函数声明,在源文件中有定义。 假设我们有一个带有一些函数的类a:

//< A.hpp
class A
{
public:
   virtual funcA();
   virtual funcB();
}
/
我们想让一个类继承a并重写它的函数

//< childA.hpp
class childA
{
   virtual funcA();
   virtual funcB();
}
/
每次更改
funcA()funcB()
的声明时,我们都需要将新声明复制并粘贴到子类头文件中。如果继承链很长,那就很麻烦了


我记得Object-C没有这个问题,是吗?

来自维基百科上的Objective-C文章:

Objective-C和Smalltalk一样,可以使用动态类型:可以向对象发送未在其接口中指定的消息


另一方面,C++是静态类型的。这是一个更严格的编译时限制。

除非要重写成员函数声明,否则不需要将其复制到子类的头文件中。在这种情况下,我认为您需要声明它的主要原因是通知任何阅读您的头文件的人,子类提供了不同的实现。原则上,编译器可以自动地计算出来,但是手工做同样的事情对人类来说可能是一件非常痛苦的事情


请注意,在许多情况下,阅读头文件的人可能无法访问正文的实际源代码(例如,如果它是作为编译对象提供给他们的专有库),因此他们不能只是查看正文来找出答案。

为什么要将定义复制到子类头文件?我想你的意思是声明。如果子类具有虚函数,则它的源文件将提供实现。否则,将调用基类虚函数。请记住,它不是纯虚拟成员函数。请更正,它应该是声明而不是定义。很抱歉给你带来了困惑。是的,如果父类中的声明更改,我们需要修改子类源文件,因为它可能有不同的实现。但是我们还需要修改子类头文件,它在父类头文件中有相同的代码。你是对的,C++不是纯O。我用C++已经有一段时间了,但是我以前从来没有注意到这个讨厌的地方。我想知道是否有什么技巧/模式可以解决它,它既不优雅也不容易维护。实际上,“纯OO”与动态或静态类型无关。不要让“objective-c”这个名字愚弄你。C++几乎为面向对象语言设置了标准。谢谢JJLIN,这是有点合理的,但是既然人们可以访问源代码,他应该知道哪些成员函数被重写。如果人们只阅读头文件,因为声明是完全相同的,人们仍然不知道子类做什么。实际上,我编辑了我的答案,以解决您关于访问源代码的问题,但您在发布评论时可能没有看到它。至于声明完全相同,人们希望评论也不完全相同