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,并了解polymorphismvirtual函数。 没有“隐式转换”之类的东西。有显式和隐式转换,而强制转换是显式转换。 【参考方案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 ++继承:将子类传递给期望基类的函数并获得子类行为的主要内容,如果未能解决你的问题,请参考以下文章

将继承的类对象的向量传递给期望基类向量的函数

继承

子类调用父类static方法怎么获得子类类名

C++中,继承时,创建子类对象,能否在子类构造函数初始化列表里调用基类构造函数?

C++继承,发送一个指向基类的指针

原型继承