C ++继承:将子类传递给期望基类的函数并获得子类行为
Posted
技术标签:
【中文标题】C ++继承:将子类传递给期望基类的函数并获得子类行为【英文标题】:C++ Inheritance: Pass sub-class to a function expecting base-class and get sub-class behaviour 【发布时间】:2018-10-23 07:14:29 【问题描述】:在下面的玩具示例中,我有一个基类和一个继承自它的类。子类覆盖方法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);
【问题讨论】:
我推荐你get a good C++ book or two to read,并了解polymorphism和virtual
函数。
没有“隐式转换”之类的东西。有显式和隐式转换,而强制转换是显式转换。
【参考方案1】:
您的BaseClass::doSomething()
不是虚拟的。这样,它就不能被覆盖,而只能被遮蔽。尝试将其签名更改为
class BaseClass
virtual void doSomething() /* ... */
;
SubClass
不需要更改,但是,使用 override
关键字是一种很好的做法(您的示例代码是一个完美的说明 - 用 override
标记方法会使编译器如果完全相同的函数签名在任何基类中都不是virtual
,请抱怨):
class SubClass : public BaseClass
void doSomething() override /* ... */
;
除此之外,请将BaseClass
析构函数也设为虚拟(或protected
),否则当通过BaseClass
指针删除SubClass
实例时,您将面临未定义行为的风险。
【讨论】:
谢谢,这行得通。更多信息(对于那些想要的人)可以在这里找到:geeksforgeeks.org/virtual-function-cpp以上是关于C ++继承:将子类传递给期望基类的函数并获得子类行为的主要内容,如果未能解决你的问题,请参考以下文章