头文件 - 继承 c++

Posted

技术标签:

【中文标题】头文件 - 继承 c++【英文标题】:Header file - Inheritance c++ 【发布时间】:2020-02-25 18:53:10 【问题描述】:

我在 C++ 方面的经验非常有限,所以如果我的问题是愚蠢的或基本的,请原谅。如下:

当用像 c++ 这样的语言做更大的项目时,你可能有一个很大的继承线,比方说,在主文件中包含每个派生类是正常的做法吗? 有什么办法可以规避这个问题,还是我错过了一些平庸的东西?

谢谢。

【问题讨论】:

如果AB的基类是C的基类,每个都有自己的头文件a.hb.hc.h ,然后c.h 将(希望并且通常)包括b.h,其中将包括a.h。如果您只需要c.h 的功能,则无需#include a.hb.h 例如,如果 B 类有 5 个子类,如何在不明确包含它们的情况下从每个子类中获取功能 你需要如果您想在同一个翻译单元中全部使用它们,请包含它们。 @Jens 子类是什么意思?我总是在我的脑海中得到那个模糊的方向。 base 和 derived 是更多的 C++ 术语。如果您当前的.cpp 文件直接使用类B 的对象,则只包含b.h。如果您当前的.cpp 文件直接使用BCJQ 类的对象,则明确包括b.hc.hj.hq.h。不要依赖其中任何一个来继续从任何其他人(因此相互包括)继承。 @John 你的最后一条评论更好地解释了我试图表达的观点。如果您使用 X.h,请包含 X.h。如果你不这样做,就把它排除在外。如果 Y.h 需要 X.h 并且不包含 X.h,则修复 Y.h。 @Jens 您确定需要五个单独的标题吗?如果它们紧密相关,它们可能都在一个标题中。在某些情况下,收集常见标头的“上帝”标头也可能适用。 【参考方案1】:

对于使用 C++ 类的 C++ 程序,它需要声明。如果该类继承自基类,则需要这些声明来处理该类声明。这递归地应用:需要类的整个继承树。

如果继承图如此深入和广泛(可能是由于多重继承)以至于项目认为它不可接受,则必须对其进行重组。类可能能够使用聚合而不是继承。也就是说,而不是:

#include <widget.h>

class foo : public widget  ... ;

可能有;

class widget; // "forward" declaration only; no #include needed
class foo  widget *pwidget; ...

现在,只有实现foo 的文件需要widget 的完整声明; foo 的客户包括"foo.h" 不需要它。

但现在foo 不再是widget 的一种,这对代码组织有影响。 foo 仍然有 widget 部分通过创建对象并持有它。如果widget 符合小部件的一些抽象接口,foo 可能能够实现它,并委托给包含的widget

另一个最小化依赖的工具是dependency inversion。

【讨论】:

更多关于 Kaz 观点的准备:Composition Over Inheritance

以上是关于头文件 - 继承 c++的主要内容,如果未能解决你的问题,请参考以下文章

C++的纯虚函数实现和头文件

C++结课大作业——职工管理系统

C++中的cmath头文件

C++头文件

c语言和c++头文件在哪些地方有所不同

c++ cout需要包含哪个头文件?