3 回答

TA貢獻1806條經驗 獲得超5個贊
您不能實例化抽象類,因此抽象類的向量不能工作。
但是,您可以使用指向抽象類的指針向量:
std::vector<IFunnyInterface*> ifVec;
這也使您可以實際使用多態行為-即使該類不是抽象的,按值存儲也會導致對象切片的問題。

TA貢獻1911條經驗 獲得超7個贊
您無法創建抽象類類型的向量,因為您無法創建抽象類的實例,并且諸如std :: vector之類的C ++標準庫容器將存儲值(即實例)。如果要執行此操作,則必須創建一個指向抽象類類型的指針向量。
您的工作流程將無法正常工作,因為虛函數(這就是您首先要抽象類的原因)僅在通過指針或引用調用時才起作用。您也不能創建引用向量,因此這是您必須使用指針向量的第二個原因。
您應該意識到C ++和C#幾乎沒有共同之處。如果您打算學習C ++,則應該從頭開始,并閱讀專門的C ++教程,例如Koenig和Moo的Accelerated C ++。

TA貢獻1777條經驗 獲得超3個贊
在這種情況下,我們甚至不能使用以下代碼:
std::vector <IFunnyInterface*> funnyItems;
要么
std::vector <std::tr1::shared_ptr<IFunnyInterface> > funnyItems;
因為FunnyImpl和IFunnyInterface之間沒有IS A關系,并且由于私有繼承,FUnnyImpl和IFunnyInterface之間也沒有隱式轉換。
您應該按照以下方式更新代碼:
class IFunnyInterface
{
public:
virtual void IamFunny() = 0;
};
class FunnyImpl: public IFunnyInterface
{
public:
virtual void IamFunny()
{
cout << "<INSERT JOKE HERE>";
}
};
- 3 回答
- 0 關注
- 454 瀏覽
添加回答
舉報