基类中派生类的组成

时间:2015-02-21 07:34:40

标签: c++ composition

例如,

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

#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

2 个答案:

答案 0 :(得分:1)

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

诀窍是在Warrior中转发声明CharacterPlayer类,而不是包含标题:

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

};
#endif

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

您最终需要在cpp文件Warrior中包含CharacterPlayer.cpp的标头,但这不会导致任何问题,因为标头之间没有循环依赖关系。

答案 1 :(得分:0)

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

要执行此操作,只需从第二个标题中删除"#include "Warrior.h",然后将其替换为"class Warrior;"

形式的声明

至于为什么这是一个坏主意:使基类包含指向派生类(或实例)的指针是一种方式(几种),确保基类的实现依赖于派生类的实现。一般来说,派生类的定义应该依赖于基类,而不是反过来,以避免循环依赖,允许基类以多态方式使用(查找&#34; Liskov替换原则)等。

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