C++继承:将子类传递给期望基类的函数并获取子类行为

Mr *_*uid 2 c++ polymorphism inheritance

在下面的玩具示例中,我有一个基类和一个继承自它的类.子类重写该方法doSomething().但是,当我将子类的实例传递给期望基类的函数时,我得到基类的行为,即输出I'm the base class!而不是I'm the child class!.我怎样才能防止这种情况发生?为什么会发生这种情况(我猜有某种隐式转换正在进行?).

非常感谢!

#include <iostream>

using namespace std;

class BaseClass {
public:
    void doSomething() {
        cout << "I'm the base class!";
    }
};

class SubClass : public BaseClass {
public:
    void doSomething() {
        cout << "I'm a child class!";
    }
};

void thisFunction(BaseClass & instance) {
    instance.doSomething();
}

int main(int, char*[]) {
    SubClass sc;
    thisFunction(sc);
}
Run Code Online (Sandbox Code Playgroud)

lub*_*bgr 5

BaseClass::doSomething()不是虚拟的.这样,它不能被覆盖,而只能被遮蔽.尝试将其签名更改为

class BaseClass {
    virtual void doSomething() { /* ... */ }
};
Run Code Online (Sandbox Code Playgroud)

所需的任何更改SubClass,它是,但是,很好的做法,利用的override关键字(例如你的代码是一个最好的例证-标记法override,使编译器抱怨,如果完全相同的函数签名是不是virtual在任何基类):

class SubClass : public BaseClass {
    void doSomething() override { /* ... */ }
};
Run Code Online (Sandbox Code Playgroud)

除此之外,请将BaseClass析构函数设置为虚拟(或protected),或者在SubClass通过BaseClass指针删除实例时存在未定义的行为风险.