亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么我們不能聲明std :: vector <AbstractClass>?

為什么我們不能聲明std :: vector <AbstractClass>?

C++
白板的微信 2019-12-13 15:10:36
我花了很多時間在C#中進行開發,但是我注意到,如果您聲明一個抽象類以便將其用作接口,則無法實例化此抽象類的向量來存儲子類的實例。#pragma once#include <iostream>#include <vector>using namespace std;class IFunnyInterface{public:    virtual void IamFunny()  = 0;};class FunnyImpl: IFunnyInterface{public:    virtual void IamFunny()    {        cout << "<INSERT JOKE HERE>";    }};class FunnyContainer{private:    std::vector <IFunnyInterface> funnyItems;};聲明抽象類向量的行在MS VS2005中導致此錯誤:error C2259: 'IFunnyInterface' : cannot instantiate abstract class我看到一個明顯的解決方法,即將IFunnyInterface替換為以下內容:class IFunnyInterface{public:    virtual void IamFunny()    {        throw new std::exception("not implemented");    }};這是C ++明智的解決方法嗎?如果沒有,是否有像boost這樣的第三方庫可以幫助我解決這個問題?
查看完整描述

3 回答

?
忽然笑

TA貢獻1806條經驗 獲得超5個贊

您不能實例化抽象類,因此抽象類的向量不能工作。


但是,您可以使用指向抽象類的指針向量:


std::vector<IFunnyInterface*> ifVec;

這也使您可以實際使用多態行為-即使該類不是抽象的,按值存儲也會導致對象切片的問題。



查看完整回答
反對 回復 2019-12-14
?
Smart貓小萌

TA貢獻1911條經驗 獲得超7個贊

您無法創建抽象類類型的向量,因為您無法創建抽象類的實例,并且諸如std :: vector之類的C ++標準庫容器將存儲值(即實例)。如果要執行此操作,則必須創建一個指向抽象類類型的指針向量。


您的工作流程將無法正常工作,因為虛函數(這就是您首先要抽象類的原因)僅在通過指針或引用調用時才起作用。您也不能創建引用向量,因此這是您必須使用指針向量的第二個原因。


您應該意識到C ++和C#幾乎沒有共同之處。如果您打算學習C ++,則應該從頭開始,并閱讀專門的C ++教程,例如Koenig和Moo的Accelerated C ++。



查看完整回答
反對 回復 2019-12-14
?
慕森王

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>";

    }

};



查看完整回答
反對 回復 2019-12-14
  • 3 回答
  • 0 關注
  • 454 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號