正确包含基类和子类(派生类)的头文件?

时间:2015-07-28 00:33:45

标签: c++ class subclass derived-class

假设我有2个基类,Base1和Base2。

// Base1.h
#ifndef BASE1_H
#define BASE1_H
#include "Base2.h"

class Base2;

class Base1 {
    ...
    void func(Base2* b);
    virtual void subfunc(Base2* b) = 0;
    ...
};
#endif



// Base2.h
#ifndef BASE2_H
#define BASE2_H
#include "Base1.h"

class Base1;

class Base2 {
    ...
    void func(Base1 *b);
    virtual void subfunc(Base1* b) = 0;
    ...
};
#endif

我在每个头文件中都包含了彼此的头文件,因为 Base1 具有 Base2 作为参数且 Base2 的功能具有 Base1 作为参数的函数。

然后假设我有 Base1 Base2 的5个子类(派生类);

Base1_Sub1,Base1_Sub2,Base1_Sub3,Base1_Sub4,Base1_Sub5 Base1
Base2_Sub1,Base2_Sub2,Base2_Sub3,Base2_Sub4,Base2_Sub5 Base2

我希望能够将5个派生类 Base1 作为类函数的参数,比如说 Base2_Sub1

// Base2_Sub1.h
#ifndef BASE2_SUB1_H
#define BASE2_SUB1_H
#include "Base2.h"
// What else to include!?

class Base2_Sub1 : public Base2 {
    ...
    void subfunc(Base1_Sub1 *b);
    void subfunc(Base1_Sub2 *b);
    void subfunc(Base1_Sub3 *b);
    void subfunc(Base1_Sub4 *b);
    void subfunc(Base1_Sub5 *b);
    ...
};
#endif

Base1_Sub1 .h到 Base1_Sub5 .h应包含哪个文件?
我还需要 Base2 的子类(例如 Base2_Sub1 )以 Base1 的子类作为函数参数以相同的方式。

我发现正确包含这些标题非常令人困惑,我不知道如何。请帮帮我。

1 个答案:

答案 0 :(得分:1)

如果您可以通过引入转发声明来避免包含标头,则无需包含标头。您的Base1.hBase2.h标头都提供了很好的示例:Base1只能使用Base2的前向声明进行编译,因为它只使用指针Base2;同样适用于Base2使用Base1指针。因此,可以安全地去除相互夹杂物。

  

应该在Base1_Sub1.hBase1_Sub5.h包含哪个文件?

在相应的Base1_Sub1.cppBase1_Sub5.cpp中必须包含。其他cpp文件应根据需要包含它们。

  

我还需要Base2的子类(例如Base2_Sub1)以Base1的子类作为函数参数以相同的方式。

对于包含头文件的头文件,如果可以使用指向Base1Base2的指针定义子类的头,则根本不要包含头。这将缩短编译代码所需的时间。

当然,您需要包含实例化的类的标头,以及您调用成员函数或访问其数据成员的类。