2016-05-25 5 views
-2

Я пытаюсь использовать виртуальные методы на C++.Чистый виртуальный метод под названием

У меня есть иерархия объектов:

class Action { 
public: 
    Action() { } 

    virtual void action() = 0; 
} 

class CubeAction : public Action { 
public: 
    CubeAction() { } 

    void action() { 
     glutSolidCube(1); 
    } 
}; 

И у меня есть контейнер для объектов базового класса.

class ActionContainer { 
private: 
    std::vector<Action *> actions; 

public: 
    void add(Action &action) { actions.push_back(&action); } 

    void doActions() { 
     for (auto a : actions) { 
      a->action(); 
     } 
    } 
}; 

И когда я пытаюсь doActions:

ActionContainter actions(); 

CubeAction cubeAction(); 
actions.add(cubeAction); 

actions.doActions(); 

Я получаю pure virtual method called ошибку.

Я использовал решение Calling a virtual function on a vector of base classes, но ошибка все же произошла.


UPD: жаль, что мой реальный код: Github. Некоторая ошибка в файле Action.h, я думаю.

+0

Поскольку код имеет синтаксические ошибки, это не ** настоящий код **. Пожалуйста, напишите полный, но минимальный пример, который читатели могут попробовать. –

+0

@JeremyThompson: Ссылка хорошая, спасибо; акроним, однако, является глупым и контрпродуктивным. Не думайте, что люди, которые задают вопросы здесь, узнают об этом. –

+0

http://meta.stackexchange.com/questions/92060/add-data-se-style-magic-links-to-comments - Я нахожу их полезными –

ответ

1

Ваш код в GitHub выглядит следующим образом:

try { 
    SphereAction sphereAction(1); 
    actions.add(sphereAction); 

    CubeAction cubeAction(2); 
    actions.add(cubeAction); 

} catch (InfoException e) { 
    cerr << e.what() << endl; 
} 

и после этого, вы звоните display(), который вызывает ActionContainer::doActions().

В контейнере вы храните указатель на аргумент, но вы передаете локальную переменную в actions.add(), которая будет недоступна и больше не будет существовать при ее использовании.

+0

Большое спасибо! Но почему два неиспользуемых вектора привели к таким последствиям? – wlad031

+0

Деструктор получает вызов, снова делая виртуальную функцию чистой. Поскольку объекты находятся в стеке, память все еще существует, даже после времени жизни объектов, до тех пор, пока она не будет перезаписана. –