C++ 如果我在另一个类中包含一个基类,该基类';s派生类也可以包括在内

C++ 如果我在另一个类中包含一个基类,该基类';s派生类也可以包括在内,c++,class,object,inheritance,C++,Class,Object,Inheritance,如果我在一个不同的类中包含一个基类,那么这个基类的派生类也会被包含吗。如果我包括一个shape类,这个类是派生类square和circle的基类,那么square和circle会包含在不同的类中吗 我想这样做,所以如果我决定稍后添加另一个shape类(称之为diamond),它将更容易编写 #include <shapes.h> #包括 而不是 #include <square.h> #include <circle.h> #include <tri

如果我在一个不同的类中包含一个基类,那么这个基类的派生类也会被包含吗。如果我包括一个shape类,这个类是派生类square和circle的基类,那么square和circle会包含在不同的类中吗

我想这样做,所以如果我决定稍后添加另一个shape类(称之为diamond),它将更容易编写

#include <shapes.h>
#包括
而不是

#include <square.h>
#include <circle.h>
#include <triangle.h>
#包括
#包括
#包括
不,不会

当您执行
#include
时,预处理器将递归地将内容内联到a.h中

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

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

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

不,它不会

当您执行
#include
时,预处理器将递归地将内容内联到a.h中

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

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


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

否,派生类的头文件将不会自动包括在内。然而,好消息是,在大多数情况下,您可能根本不需要包含派生类的头文件-负责创建不同形状对象的代码需要了解有关圆和三角形的信息,但在大多数情况下绘制形状可以简单地调用一个虚拟的
draw
函数,该函数将对给定的任何一种形状执行正确的操作。虚拟函数的实现方式是,调用shape的
draw
函数将正确调用circle和triangle的重写版本,即使这些类的头文件未包含在调用的文件中

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


对于通常希望包含在一起的一大堆头文件这一更普遍的问题,可以通过创建包含所有其他头文件的单个头文件来简化工作。例如,您可以创建
shape_library.h
,并将所有不同的形状标题的
#include
s放在其中。这样,其他所有内容都可以包括
shape\u library.h
,如果标题被重新排列,您只有一个地方可以更改

否,派生类的头文件将不会自动包括在内。然而,好消息是,在大多数情况下,您可能根本不需要包含派生类的头文件-负责创建不同形状对象的代码需要了解有关圆和三角形的信息,但在大多数情况下绘制形状可以简单地调用一个虚拟的
draw
函数,该函数将对给定的任何一种形状执行正确的操作。虚拟函数的实现方式是,调用shape的
draw
函数将正确调用circle和triangle的重写版本,即使这些类的头文件未包含在调用的文件中

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


对于通常希望包含在一起的一大堆头文件这一更普遍的问题,可以通过创建包含所有其他头文件的单个头文件来简化工作。例如,您可以创建
shape_library.h
,并将所有不同的形状标题的
#include
s放在其中。这样,其他所有内容都可以包括
shape\u library.h
,如果标题被重新排列,您只有一个地方可以更改

#include
就像在该行插入所有文本一样。您不包括类。您包括文件。您应该使用
来包括您自己的标题;使用
\include
就像在该行插入所有文本一样。您不包括类。您包括文件。您应该使用
来包括您自己的标题;使用