[英]composition of Inherited classes
可能已經有一個問題了,但我找不到。
我敢肯定有一個簡單的解決方案,但我看不到。
假設您具有以下條件:
class FooBase
{
protected:
BarBase myInstance;
}
class FooChild : public FooBase
{
protected:
BarChild myInstance;
}
class BarChild : public BarBase
{
}
因此,基本上,您想在FooChild類中使用BarBase的派生版本。
我認為在上面的代碼中,將有2個不同的myInstance實例(一個BarBase和一個BarChild)。
我只想擁有一個實例,這樣我就可以在FooBase中使用BarBase,而在FooChild中使用BarChild。
有一個優雅的解決方案嗎?
您是否可以嘗試這樣的操作,以便僅創建一個實例。
#include <iostream>
class BarBase
{
}
;
class BarChild : public BarBase
{
}
;
class FooBase
{
public:
FooBase(BarBase* baseBar);
protected:
BarBase* myInstance;
}
;
class FooChild : public FooBase
{
public:
FooChild(BarBase* base)
;
}
;
FooBase::FooBase(BarBase* baseBar)
{
myInstance = baseBar;
}
FooChild::FooChild(BarBase* childBar) : FooBase(childBar)
{
}
int main()
{
BarChild *bc = new BarChild();
FooChild fc(bc);
}
我不知道這是正確的解決方案還是優雅的解決方案;)
可以選擇模板嗎?
tempalate <typename T = BarBase>
class FooBase{
protected:
T myInstance;
};
class FooChild : public FooBase<BarChild> {};
如果我使用int
和double
進行測試,則僅使用一個成員變量即可按需工作 : http : //ideone.com/nOfR5x
但是,它確實需要在FooBase
聲明后FooBase
尖括號。
我相信,虛擬化是您正在尋找的東西。 看看吧。 您可以簡單地使用構造器方法來創建這些變量。 如果創建派生類,則它將調用該類的構造函數,該構造函數將創建該變量。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.