无法实例化抽象类

时间:2015-03-08 21:06:39

标签: c++

我有一个抽象类:

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抽象类的各种类型实现的向量:

vector<myabsclass> vec;

我尝试这样做时出错:

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

VS2013中的错误消息是:

Cannot instantiate abstract class

我试图理解为什么,考虑到我认为这应该是有效的。向量需要包含此类的所有不同类型的实现,因此我无法明确地将其作为实现者的向量:

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

关于编译器为什么会窒息的任何想法?这是编译器错误吗?

2 个答案:

答案 0 :(得分: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>?

非常相似

答案 1 :(得分:0)

抽象类无法实例化,因此使OBJECTS的向量会尝试复制它们,这是不可能的。

一个简单的解决方案是使用指针向量,这样就可以使用多态

std::vector<myabsclass*>