派生 class 在基础 class 中的组合

composition of a derived class in a base class

例如。我们有 class A 及其派生的 class; class B。是否可以在 class A 中实例化 B 类型的指针?

#ifndef WARRIOR_H
#define WARRIOR_H

#include "CharacterPlayer.h"
class Warrior: public CharacterPlayer
{
public:
    virtual void printCharacterName();
};
#endif

然而,当我尝试实例化一个 Warrior 指针或尝试包含 "Warrior.h" 时,它给了我一些语法错误。

#ifndef CHARACTERPLAYER_H
    #define CHARACTERPLAYER_H
    #include "Warrior.h"
    class CharacterPlayer
    {
    public:
        Warrior *warriorPntr = nullptr;
        virtual void printCharacterName();

    };
    #endif

您的 header 之间存在循环依赖:"CharacterPlayer.h" 包含 "Warrior.h""Warrior.h" 包含 "CharacterPlayer.h"。这无法编译,因为 "sentinel" 将停止包含。

诀窍是 forward-declare Warrior class 在 CharacterPlayer 中,而不是包括 header:

#ifndef CHARACTERPLAYER_H
#define CHARACTERPLAYER_H
class Warrior; // <<== Here
class CharacterPlayer
{
public:
    Warrior *warriorPntr = nullptr;
    virtual void printCharacterName();

};
#endif

这足以声明指向 Warrior 的指针和引用,但不足以调用方法或实例化 class。

您最终需要在 cpp 文件 CharacterPlayer.cpp 中包含 Warrior 的 header,但这不会导致任何问题,因为您的 headers.

可以,但这不是一个好主意。

要做到这一点,只需从第二个 header 中删除 "#include "Warrior.h",并将其替换为 "class Warrior;"

形式的声明

至于为什么这是个坏主意:使基 class 包含指向派生 class(或实例)的指针是确保实现的一种(几种)方式基础 class 取决于派生 class 的实现。一般来说,derivedclass的定义应该依赖于baseclass,而不是反过来,为了避免循环依赖,让baseclass可以多态使用(查找《里氏代换原则》等

这意味着,虽然可以做到,但您的设计存在根本性缺陷。它会阻止你以后做其他有用的事情。