我有一个抽象类:
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.
关于编译器为什么会窒息的任何想法?这是编译器错误吗?
答案 0 :(得分:1)
矢量本身存储实例的副本,因此它会尝试复制myabsclass类型的元素。 这种行为仅由指针或引用支持。
一种解决方案是使用std :: shared_ptr。
std::vector<std::shared_ptr<myabsclass>> vec;
vec.push_back(std::make_shared<myclass2>());
非常相似
答案 1 :(得分:0)
抽象类无法实例化,因此使OBJECTS的向量会尝试复制它们,这是不可能的。
一个简单的解决方案是使用指针向量,这样就可以使用多态。
std::vector<myabsclass*>