gpt4 book ai didi

c++ - C++派生类是否必须在头文件中包含继承函数/成员的定义?

转载 作者:可可西里 更新时间:2023-11-01 18:35:54 25 4
gpt4 key购买 nike

标题几乎说明了一切 - 派生类是否必须在头文件中重新包含从父类继承的函数/数据成员的定义?

是否可以从继承语句中隐含继承的函数/成员?是否应该明确地重新声明它们以提高可读性,或者这可能会隐藏风险?

我不确定我应该在派生类的头文件中做什么。

最佳答案

Does C++ derived class ever have to include definitions of inherited functions/members in header file?

从字面上看:不需要 - 在 C++ 中,任何 非模板函数的定义 - 无论继承或类成员身份 - 永远不需要出现在 header 中。类仅定义静态数据成员 - 在它们的实现文件中根据单一定义规则 - 基类定义不需要也不能在任何派生类中重复。

也就是说,我认为您一定在考虑函数声明,它:

  • 不需要 为非虚函数重复,尽管您可能需要 using 语句来公开隐藏的基类函数
  • 必须 在派生类覆盖基类的 virtual 函数定义/实现时在派生类定义中重复(允许协变的变化非常有限返回类型,以及更改默认参数的能力 - 但不要这样做!)。

例如:

struct Base { virtual void f() = 0; };

struct Derived : Base { virtual void f(); }; // must mention f() here...

// then either in same header as Derived (and `inline` per One Definition Rule) or
// out-of-line in an implementation file...

?inline? void Derived::f() { std::cout << "Hello world\n"; } // ...to define it here

如果您没有在 struct Derived { } 中提及 f(),编译器将假定您将要:

  • 使用基类定义/实现(如果任何/上面的示例有 = 0 用于纯虚函数,所以没有可用的)),或者
  • 稍后在派生更多的类/结构中指定实现(如果它是纯虚拟的,则此类将保持抽象,您不能创建此类类型的对象)。

Can the inherited functions/members be implied from the inheritance statement? Should they be explicitly re-declared for readability or could this risk hiding?

对于几乎所有情况,这都包含在我上面所说的内容中(即,您只需重新声明您将为其提供新定义的函数);异常(exception)情况是在基类中是纯虚拟的函数,并且在您的派生类中将保持纯虚拟...如果您认为它们具有一些文档值(value),您可以选择声明它们 - 它根本没有区别。

I am unsure what I should do in header files of derived classes.

通常你只想指定:

  • 额外的职能和成员,
  • 对您希望公开的任何隐藏函数使用语句
  • virtual 您将为其提供新定义的函数,无论是在派生类的 header 中内联还是在其实现文件中外联

您不需要重复数据成员定义。

关于c++ - C++派生类是否必须在头文件中包含继承函数/成员的定义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19799922/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com