2017-01-07 2 views
1
class Road { 
private: 
    std::vector<Vehicle*> container; 
public: 
    std::vector<Vehicle*> getContainer(){ 
     return container; 
    } 
    virtual void operator+(Vehicle *vehicle)=0; 
}; 


class Highway: public Road { 
public: 
    virtual void operator+(Vehicle *vehicle) { 
     getContainer().push_back(vehicle); 
    } 
}; 

Почему возникает ошибка, по которой я не могу выделить объект абстрактного типа, когда все мои виртуальные функции переопределены? Это происходит, когда я пытаюсь позвонить Road r = Highway(); в мой основной класс.Ошибка при попытке определить объект типа класса, который получен из абстрактного класса

+2

'getContainer' должен возвращать ссылку на' container' переменной-члена. В вашем коде каждый раз, когда вы вызываете 'getContainer()', вы возвращаете копию переменной 'container'. – MRB

+0

@cokceken: Нет, не следует. –

+0

_ «Это происходит, когда я пытаюсь вызвать« Road r = Highway(); 'в моем основном классе». _ Какова ваша цель с этой строкой кода? Что вы пытаетесь сделать? Только зная, что мы можем сказать вам, как это исправить. –

ответ

3

Для Road r = Highway();, Road r означает, что вы пытаетесь определить объект типа Road, который является абстрактным классом, тогда определение не допускается. Часть списка инициализатора (то есть = Highway()) не влияет на тип r, это просто означает, что r является slicing-copy, инициализированным из временного объекта типа Highway.

Вы должны использовать указатели/умные указатели или ссылки с абстрактным типом класса, например.

Road* r = new Highway; 
// using r ... 
delete r; 

или

Highway h; 
Road& r = h; 
// using r ... 
+0

Также обратите внимание, что даже если бы это было возможно, присвоение 'Highway'' дороге '[приведет к разделению данных] (http://ideone.com/BdVS4L). –

Смежные вопросы