[英]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.