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)
你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指针删除实例时存在未定义的行为风险.