如果我在不同的类中包含基类,那么也将包括该基类的派生类

时间:2017-05-18 04:12:16

标签: c++ class object inheritance

如果我在不同的类中包含基类,那么也将包括该基类的派生类。如果我包含let说一个形状类,并且该类是派生类square和circle的基类,则square和circle将包含在该不同的类中。

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

#include <shapes.h>

而不是......

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

2 个答案:

答案 0 :(得分:3)

不,它不会。

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

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

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

如果你这样做,也许有一天你只想创建一个派生自基类的类,你可以包含所有未使用的派生类,从而增加代码大小。

答案 1 :(得分:1)

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

如果您发现代码经常需要知道某个东西是圆形还是三角形(因此需要包含头文件),这可能表明形状类的界面存在问题。在这种情况下,您应该再看一下形状,看看是否可以通过调用虚函数的方式对其进行更改,并让编译器找出哪个是每个形状的正确实现。

对于通常需要包含一大堆头文件的更一般问题,您可以通过创建包含所有其他头文件的单个头文件来简化生活。例如,您可以创建shape_library.h并为其中的所有不同形状标题添加#include。这样,其他所有内容都可以包含shape_library.h,如果标题重新排列,您只有一个地方可以更改。