2015-03-08 180 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*> 
相关问题