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

Passing a subclass object to a function that takes superclass object

本文关键字:对象 超类 函数 子类      更新时间:2023-10-16

>假设以下代码:

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。该函数获取自己的参数副本,这是一个Event对象,而不是SubEvent。您可以通过传递引用来解决此问题:

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

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

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