9

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

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

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

4

3 回答 3

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

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

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

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

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

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

通常你只想指定:

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

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

于 2013-11-07T07:40:01.857 回答
2

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

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

继承声明中可以隐含继承的函数/成员吗?

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

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

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

或者这个风险可以隐藏吗?

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

于 2013-11-05T22:04:19.860 回答
1

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

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

于 2013-11-05T22:05:39.673 回答