头文件 - 继承 c++
Posted
技术标签:
【中文标题】头文件 - 继承 c++【英文标题】:Header file - Inheritance c++ 【发布时间】:2020-02-25 18:53:10 【问题描述】:我在 C++ 方面的经验非常有限,所以如果我的问题是愚蠢的或基本的,请原谅。如下:
当用像 c++ 这样的语言做更大的项目时,你可能有一个很大的继承线,比方说,在主文件中包含每个派生类是正常的做法吗? 有什么办法可以规避这个问题,还是我错过了一些平庸的东西?
谢谢。
【问题讨论】:
如果A
是B
的基类是C
的基类,每个都有自己的头文件a.h
,b.h
,c.h
,然后c.h
将(希望并且通常)包括b.h
,其中将包括a.h
。如果您只需要c.h
的功能,则无需#include
a.h
和b.h
。
例如,如果 B 类有 5 个子类,如何在不明确包含它们的情况下从每个子类中获取功能 你需要如果您想在同一个翻译单元中全部使用它们,请包含它们。
@Jens 子类是什么意思?我总是在我的脑海中得到那个模糊的方向。 base 和 derived 是更多的 C++ 术语。如果您当前的.cpp
文件直接使用类B
的对象,则只包含b.h
。如果您当前的.cpp
文件直接使用B
、C
、J
和Q
类的对象,则明确包括b.h
、c.h
、j.h
和q.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++的主要内容,如果未能解决你的问题,请参考以下文章