假设以下代码:
class Event {
public:
virtual void execute() {
std::cout << "Event executed.";
}
}
class SubEvent : public Event {
void execute() {
std::cout << "SubEvent executed.";
}
}
void executeEvent(Event e) {
e.execute();
}
int main(int argc, char ** argv) {
SubEvent se;
executeEvent(se);
}
执行时,程序输出“Event executed。”,但我想执行SubEvent。我怎么能这样做?
答案 0 :(得分:5)
您按价值传递Event
。该函数获取自己的参数副本,这是Event
对象,而不是SubEvent
。您可以通过传递引用来解决此问题:
void executeEvent(Event& e)
{// ^
e.execute();
}
这称为object slicing。它相当于:
SubEvent se;
Event e{se};
e.execute();