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

标签 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 作为参数。

然后假设我有 5 个子类(派生类)用于 Base1Base2

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

我希望能够将 Base1 的 5 个派生类作为类函数的参数,比方说 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 的子类作为函数参数。

我发现正确地包含这些 header 非常令人困惑,而且我不知道如何做。请帮助我。

最佳答案

如果可以通过引入前向声明来避免包含 header ,则不需要包含 header 。您的 Base1.hBase2.h header 都提供了很好的示例:Base1 can compile with only a forward declaration of Base2,因为它只使用指向 Base2 的指针; Base2Base1 指针的使用也是如此。因此,可以安全地去除相互包含。

In what file should Base1_Sub1.h to Base1_Sub5.h be included?

包含在它们相应的 Base1_Sub1.cppBase1_Sub5.cpp 中是强制性的。其他 cpp 文件应根据需要包含它们。

I also need subclasses of Base2 (such as Base2_Sub1) to have subclasses of Base1 as function parameter the same way.

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

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

关于c++ - 正确包含基类和子类(派生类)的头文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31665600/

相关文章:

c++ - for 循环的问题

c++ - 使用 C++ 的 Palindrome 程序的意外输出

java - 如何从数组中打印出对象?

event-handling - 如何在不实例化事件中每个实例的情况下处理子类 View 事件?

java - 以子类作为参数的重载方法,但将方法称为父类(super class)

c++ - 使用 sendmessage 将 wm_close 发送到另一个进程

c++ - 我是否以线程安全的方式使用这个双端队列?

java - 对Java中继承方法和字段的困惑

c# - Java 的 getClass()、isAssignableFrom() 等的 c# 等价物是什么?

java - 防止方法调用使用子类的方法