C++ 继承:将子类传递给需要基类的函数并获取子类行为
C++ Inheritance: Pass sub-class to a function expecting base-class and get sub-class behaviour
在下面的玩具示例中,我有一个基类和一个继承自它的类。子类将重写方法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
实例时,您将面临未定义的行为风险。
相关文章:
- C++ 继承:将子类传递给需要基类的函数并获取子类行为
- 有没有办法按值将纯抽象类的所有子类传递给 C++ 中的函数?
- 使用子类覆盖基类中定义的函数
- 基类中的默认析构函数禁用子类中的移动构造函数(如果有成员)
- 父类的私有函数会导致对具有相同名称和相似参数的子类中的公共函数的不明确调用
- 由于签名差异,调用了错误的子类函数
- 从父类的向量访问子类函数,而无需向下转换
- 在子类函数覆盖中省略具有默认值的参数
- 有没有办法在C++中调用基类的所有子类函数?
- 无法调用子类函数,C++
- 子类作为模板模板基类的模板参数,而该类别又是子类函数参数
- 从同一父调用调用不同的子类函数
- 在子类函数中访问超类友元的受保护数据成员
- 调用子类函数
- 相对于更专业的继承函数,模板更喜欢子类函数
- 重载的子类函数,将子类的实例作为参数,如何使用
- 调用超类上不存在的子类函数
- 遗产.从父类调用子类函数
- C++ 重载函数运算符和继承,无法在子类函数中正确使用它
- 访问父类对象集合的成员的子类函数