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

5 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);
}
Run Code Online (Sandbox Code Playgroud)

执行时,程序输出"Event executed.",但我想执行SubEvent.我怎样才能做到这一点?

jua*_*nza 5

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

void executeEvent(Event& e) 
{//                    ^
  e.execute();
}
Run Code Online (Sandbox Code Playgroud)

这称为对象切片.它相当于:

SubEvent se;
Event e{se};
e.execute();
Run Code Online (Sandbox Code Playgroud)