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

C++ Inheritance: Pass sub-class to a function expecting base-class and get sub-class behaviour

本文关键字:子类 函数 基类 获取 继承 C++      更新时间:2023-10-16

在下面的玩具示例中,我有一个基类和一个继承自它的类。子类将重写方法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);
}

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

class BaseClass {
virtual void doSomething() { /* ... */ }
};

SubClass不需要更改,但是,使用override关键字是一种很好的做法(您的示例代码就是一个完美的例证 - 如果在任何基类中都没有virtual完全相同的函数签名,则用override标记该方法会使编译器抱怨(:

class SubClass : public BaseClass {
void doSomething() override { /* ... */ }
};

除此之外,请将BaseClass析构函数也设为虚拟(或protected(,否则在通过BaseClass指针删除SubClass实例时,您将面临未定义的行为风险。