派生 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可以多态使用(查找《里氏代换原则》等
这意味着,虽然可以做到,但您的设计存在根本性缺陷。它会阻止你以后做其他有用的事情。
例如。我们有 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可以多态使用(查找《里氏代换原则》等
这意味着,虽然可以做到,但您的设计存在根本性缺陷。它会阻止你以后做其他有用的事情。