将子类对象传递给采用超类对象的函数

时间:2013-11-16 14:09:50

标签: c++ polymorphism

假设以下代码:

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。我怎么能这样做?

1 个答案:

答案 0 :(得分:5)

您按价值传递Event。该函数获取自己的参数副本,这是Event对象,而不是SubEvent。您可以通过传递引用来解决此问题:

void executeEvent(Event& e) 
{//                    ^
  e.execute();
}

这称为object slicing。它相当于:

SubEvent se;
Event e{se};
e.execute();