2015-03-08 6 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; 
} 

Если у меня есть вектор, который содержит различные типы implementions в 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. 

Любые идеи о том, почему компилятор душит? Это ошибка компилятора?

ответ

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*> 
Смежные вопросы