簡體   English   中英

基類中派生類的組成

[英]composition of a derived class in a base class

例如。 我們有class A類及其派生類。 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

您的標頭之間具有循環依賴關系: "CharacterPlayer.h"包括"Warrior.h""Warrior.h"包括"CharacterPlayer.h" 這不能編譯,因為“前哨”將停止包含。

訣竅是在CharacterPlayer向前聲明Warrior類,而不是包含標頭:

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

};
#endif

這足以聲明對Warrior指針和引用,但不足以調用方法或實例化該類。

您最終需要在cpp文件CharacterPlayer.cpp包含Warrior的標頭,但這不會導致任何問題,因為標頭之間沒有循環依賴關系。

您可以,但這不是一個好主意。

為此,只需從第二個標頭中刪除"#include "Warrior.h" ,然后將其替換為形式為"class Warrior;"的聲明即可"class Warrior;"

關於為什么這是一個壞主意:使基類包含指向派生類(或實例)的指針是確保基類實現取決於派生類的實現的一種方法。 一般來說,派生類的定義應取決於基類,而不是相反的類,以避免循環依賴關系,以允許基類被多態使用(查找“ Liskov替代原理”等)。

這意味着,盡管可以做到,但是您的設計從根本上來說是有缺陷的。 它將阻止您將來做其他有用的事情。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM