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

use*_*112 7 c++ polymorphism inheritance header

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

可以从继承语句隐含继承的函数/成员吗?它们是否应该为了可读性而明确重新声明,否则这可能会隐藏?

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

Ton*_*roy 5

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 world\n"; }  // ...to define it here
Run Code Online (Sandbox Code Playgroud)

如果您不提及f()inside struct Derived { },编译器将假定您将:

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

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

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

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

通常你只想指定:

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

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


Man*_*ria 2

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

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

继承语句中可以隐含继承的函数/成员吗?

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

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

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

或者这可能会冒隐藏的风险吗?

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