我有這個基類:
class LevelPlayer
{
protected:
int level;
int id;
public:
LevelPlayer():id(-1){}
LevelPlayer(int level,int id):level(level),id(id){}
virtual ~LevelPlayer()=default;
LevelPlayer(const LevelPlayer&)=default;
LevelPlayer& operator=(const LevelPlayer&)=default;
};
這個派生類:
class GroupPlayer: public LevelPlayer
{
private:
IdPlayer* ptr;
public:
GroupPlayer():LevelPlayer(),ptr(nullptr){}
GroupPlayer(int level,int id,IdPlayer* ptr):LevelPlayer(level,id),ptr(new IdPlayer(*ptr)){}
~GroupPlayer()override=default;
GroupPlayer(const GroupPlayer&);
GroupPlayer& operator=(const GroupPlayer&);
};
對于派生的復制ctor,我寫了這個:
GroupPlayer::GroupPlayer(const GroupPlayer& player):ptr(new IdPlayer(*(player.ptr))){}
但我不確定它是否正確......我還應該添加LevelPlayer(player)嗎?
uj5u.com熱心網友回復:
我不確定它是否正確......我還應該添加
LevelPlayer(player)嗎?
是的,派生類復制建構式需要顯式呼叫基類復制建構式:
GroupPlayer::GroupPlayer(const GroupPlayer& player)
: LevelPlayer(player), ptr(new IdPlayer(*(player.ptr)))
{
}
由于您已經實作了派生類的復制建構式,并且基類建構式接受了一個輸入引數,因此您需要為該引數傳入一個值。如果不這樣做,基類的默認建構式將被替代,并因此被稱為level以及id不會從復制player。
uj5u.com熱心網友回復:
查看建構式并看到
ptr(new IdPlayer(*ptr))
ptr(new IdPlayer(*(player.ptr)))
我得出的結論是,您不需要默認指標和復制建構式。制作成員和第二個建構式
IdPlayer player;
GroupPlayer(int level, int id, const IdPlayer& player): LevelPlayer(level, id), player{player} {}
而不是IdPlayer* ptr;并洗掉其他建構式。最后,在代碼中的標點符號后使用空格,這使得閱讀和代碼選擇更加容易。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/368715.html
