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



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

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

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

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

从字面上看:不 - 在C++中,任何非模板函数的定义 - 无论继承或类成员资格如何 - 都不需要出现在标头中。 类仅定义静态数据成员 - 根据一个定义规则在其实现文件中 - 基类定义不需要也不能在任何派生类中重复。

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

  • 不需要对非虚函数重复,尽管您可能希望使用 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 worldn"; }  // ...to define it here

如果你没有在struct Derived { }中提到f(),编译器会假设你将:

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

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

对于几乎所有情况,我上面所说的都涵盖了这一点(即你只重新声明你将为其提供新定义的函数);例外情况是在基类中是纯虚拟的函数,并且在派生类中将保持纯虚拟......如果你认为它有一些文档价值,你可以选择声明它们 - 它根本没有区别。

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

通常您只想指定:

  • 附加函数和成员,
  • using要公开的任何隐藏函数的语句
  • virtual将为其提供新定义的函数,无论是在派生类的标头中内联还是在其实现文件中
  • 外联

无需重复数据成员定义。

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

您需要通过头文件指定父(基)类声明。继承的函数不需要重新声明。

继承的函数/成员是否可以从继承中隐含 陈述?

如果我正确理解你的问题,是的,它们是隐含的,因为它们不需要再次明确指定。

是否应明确重新声明它们以提高可读性

由于继承的是类而不是函数,因此不需要重新声明函数。此外,重新声明可能并不总是提高可读性(它也会使文件混乱)。

或者这种风险会隐藏吗?

只要不更改访问修饰符,信息隐藏或抽象就不会受到影响。

你不应该重新声明,因为这会保证隐藏。

继承是基础知识,因此阅读您的代码的其他人会记得检查基类中是否存在他们找不到的任何成员声明。

最新更新