如果我在不同的类中包含基类,是否也会包含该基类的派生类

If i include a base class in a different class, will that base's derived classes be included also

本文关键字:基类 是否 派生 包含该 如果 包含      更新时间:2023-10-16

如果我在不同的类中包含基类,该基类的派生类是否也会包含在内。如果我包含一个形状类,并且该类是派生类方形和圆形的基类,那么方形和圆形是否会包含在该不同的类中。

我想这样做,所以如果我决定稍后添加另一个形状类(称之为菱形),它会更容易编写......

#include <shapes.h>

而不是...

#include <square.h>
#include <circle.h>
#include <triangle.h>

不,它不会。

当你执行#include<a.h>时,预处理器递归地内联 a.h 中的内容。

因此,在您的情况下,您只会获得基类。

此外,这样做不是一个好主意(包括基类所在的.h并获取所有派生类)。

如果这样做,也许有一天你只想创建一个从基派生的类,包括所有根本不使用的派生类,从而增加代码大小。

否,派生类的头文件不会自动包含。但是,好消息是,在大多数情况下,您可能根本不需要包含派生类的头文件 - 负责创建不同形状对象的代码需要了解圆形和三角形,但在大多数情况下,绘制形状的代码(例如)可以简单地调用虚拟draw函数,该函数将为碰巧的形状做正确的事情。鉴于。虚函数的实现方式是,调用 shape 的draw函数将正确调用圆形和三角形的重写版本,即使这些类的头文件未包含在进行调用的文件中也是如此。

如果你发现你的代码经常需要知道某物是圆形还是三角形(因此需要包含头文件),这可能表明 shape 类的接口存在问题。在这种情况下,您应该再看一下形状,看看是否可以以可以调用虚函数的方式更改它,并让编译器整理出每个形状的正确实现。

对于通常希望包含在一起的一大堆头文件这一更普遍的问题,您可以通过创建一个包含所有其他头文件的单个头文件来使生活更轻松。例如,您可以创建shape_library.h并将所有不同形状标题的#includes放在其中。这样,其他所有内容都可以只包含shape_library.h,如果标题重新排列,您只有一个地方可以更改。