2016-01-20 1 views
0

Я получил базовый класс под названием «Рабочий» и два производных класса «Торговец и Бейкер».C++ Не удается создать экземпляр абстрактного класса при попытке переопределить метод

class Worker 
{ 
private: 
    string _name; 
public: 
    Worker(string, string, string, int); 
    ~Worker(); 
    virtual string atributes() = 0; 
}; 

class Merchant : public Worker 
{ 
private: 
    string _skillLevel; 
public: 
    Merchant(string, string); 
    string atributes() override; 
}; 

class Baker : public Worker 
{ 
private: 
    string yearsOfExperiance; 
public: 
    Baker(string, string); 
    string atributes() override; 
}; 

Я создал список list<Workers> Workers и я добавляю туда торговец и Бейкер объекты, как это:

void addToList(string name, string atributes, list<Worker>& Worker) 
{ 
    if (name == "John") 
    { 
     Baker kk = Baker(name, atributes); 
     Workers.push_front(kk); 
    } 
    else if (profesja == "Barack") 
    { 
     Merchant pp = merchant(name, atributes); 
     Workers.push_front(pp); 
    } 
} 

Проблема заключается в том, когда я пытаюсь скомпилировать код происходит ошибка C2259. Это говорит

«работник»: не может создать экземпляр класса абстрактная

Можете ли вы сказать мне, как решить эту проблему, пожалуйста?

+1

Ваш список имеет кучу 'воркера, верно? Но у вас не может быть простой «рабочий», только «Бейкер» или «Торговец» (это то, что означает абстрактный). Таким образом, список не может содержать никаких «Рабочих» в нем. – immibis

ответ

1

Вы пытаетесь использовать полиморфизм, не используя указатель или ссылки, это не работает, поскольку срез объектов будет происходить, а срез объектов должен иметь возможность построить разрезанный тип.

STL коллекций работа storying копии значений, это означает, что здесь

Baker kk = Baker(name, atributes); 
Workers.push_front(kk); 

Baker объект создается на стеке, а затем добавить к коллекции, но коллекция шаблонных для хранения Worker экземпляров , поэтому метод пытается построить экземпляр Worker из Builder (который должен быть законным, так как Builder является Worker) через конструктор копирования.

Поэтому в основном то, что push_back пытается сделать вид

Builder builder = Builder(); 
Worker worker = Worker(builder); 

Но это не может быть сделано, потому что Worker является абстрактным.

Для решения этой проблемы необходимо использовать указатели, возможно, вместе с смарт-указатель обертку, например:

std::vector<std::unique_ptr<Worker>> workers;