2015-03-08 160 views
0

我有一個抽象類:無法實例化抽象類

class myabsclass { 
public: 
    virtual int func1() = 0; 
    virtual int func2() = 0; 
}; 

和類實現它:

class myclass : public myabsclass { 
public: 
    myclass() {} 
    int func1() { return 0; } 
    int func2() { return 1; } 
private: 
    int a,b,c; 
} 

class myclass2 : public myabsclass { 
public: 
    myclass2() {} 
    int func1() { return 3; } 
    int func2() { return 4; } 
private: 
    int d,e,f; 
} 

如果我持有各類myabsclass抽象類的implementions的矢量:

vector<myabsclass> vec; 

我得到一個錯誤,當我嘗試這樣做:

在VS
vec.push_back(myclass); 
vec.push_back(myclass2); 

錯誤消息:

Cannot instantiate abstract class 

我試圖理解爲什麼,考慮到我相信這應該是有效的。矢量需要持有各種不同類型的這一類的實現的,所以我不能明確地讓它的實現者的一個載體:

vector<myclass> vec; // Wont work since I need to put myclass2 in there. 

爲什麼編譯器是窒息任何想法?這是一個編譯器錯誤?

回答

1

矢量本身存儲您的實例副本,因此它會嘗試複製myabsclass類型的元素。 這種類型的行爲只支持指針或引用。

一個解決方案是使用std :: shared_ptr。

std::vector<std::shared_ptr<myabsclass>> vec; 
vec.push_back(std::make_shared<myclass2>()); 

你提的問題是非常相似的Why can't we declare a std::vector<AbstractClass>?

0

一個抽象類不能被實例化等等,使物體的向量會嘗試複製它們,這是不可能的。

一個簡單的解決方案是使用指針向量,這樣做可以讓您使用多態性

std::vector<myabsclass*>