我正在尝试在C ++中使用虚拟方法。
我有一个对象层次结构:
select date '2016-05-25' - date '2016-01-02' as diff1,
date '2016-05-25' - date '0016-05-25' as diff2,
date '0016-05-25' - date '2016-01-02' as diff3,
trunc(sysdate) - date '2016-01-02' as diff4
from dual;
DIFF1 DIFF2 DIFF3 DIFF4
---------- ---------- ---------- ----------
144 730487 -730343 144
我有一个容器用于基类的对象。
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();
错误。
我使用了Calling a virtual function on a vector of base classes解决方案,但错误仍然发生。
UPD:抱歉,这是我的真实代码:Github。我认为pure virtual method called
文件中有一些错误。
答案 0 :(得分: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()
,这将超出范围,并且在使用时不再存在。