标题几乎说明了一切——派生类必须重新包含从父类继承的函数/数据成员的定义在头文件中吗?
继承声明中可以隐含继承的函数/成员吗?是否应该明确地重新声明它们以提高可读性,或者这种风险是否会隐藏?
我不确定我应该在派生类的头文件中做什么。
标题几乎说明了一切——派生类必须重新包含从父类继承的函数/数据成员的定义在头文件中吗?
继承声明中可以隐含继承的函数/成员吗?是否应该明确地重新声明它们以提高可读性,或者这种风险是否会隐藏?
我不确定我应该在派生类的头文件中做什么。
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
您将为其提供新定义的函数,无论是在派生类的标头中内联还是在其实现文件中外联您不需要重复数据成员定义。
C++ 派生类是否必须在头文件中包含继承函数/成员的定义?
您需要通过头文件指定父(基)类声明。继承的函数不需要重新声明。
继承声明中可以隐含继承的函数/成员吗?
如果我正确理解您的问题,是的,它们是隐含的,因为它们不需要再次明确指定。
是否应该明确地重新声明它们以提高可读性
由于您继承的是类而不是函数,因此不需要重新声明函数。此外,重新声明可能并不总能提高可读性(它也会使文件变得混乱)。
或者这个风险可以隐藏吗?
您不应该重新声明,因为这将保证隐藏。
继承是基础知识,因此阅读您的代码的其他人会记得检查基类以查找他们找不到的任何成员声明。