C++虚重载函数被继承时的一个问题

本文讲述虚的重载函数在被继承时遇到的一个问题。

一 问题

假设有个基类如下,它有2个重载函数process,而且是虚函数,

class Base {
public:
    virtual void process(int x) {qDebug() << "Base::p1\n";};
    virtual void process(int a,float b) {qDebug() << "Base::p2\n";}
protected:
    int pd;
    float pb;
};

这时有个派生类如下,只覆写了第一个函数,

class derived: public Base
{
public:
    virtual void process(int x) { std::cout << "Der::p1\n"; }
};

main函数如下,

int main() 
{

    derived d = derived();
    d.process(100, 1.0); // 错误
}

编译时会报错,提示对象d没有这个函数,似乎和我们平时理解的不一样,平时理解的是如果子类不覆写父类的虚函数,那么调用时就会直接调用父类的对应函数。为什么这样呢?

这里找到了答案,

When you override a virtual method in a class, any overloads of that method that are not overridden are hidden for that class and cannot be used.

意思就是如果基类里有多个同名的虚重载函数,只要在子类里没有被覆写,那么就会对子类隐藏,也就是子类无法使用这个未被覆写的重载函数。


二 解决办法

有2个解决办法,

1. 把剩余的虚重载函数在子类里也实现一遍

如下这样,

class derived: public Base
{
public:
    virtual void process(int x) { std::cout << "Der::p1\n"; }
    virtual void process(int x,float b) { std::cout << "Der::p2\n"; }
};

似乎有点蠢

2. 使用using来解决

class derived: public Base
{
public:
    using Base::process;
    virtual void process(int x) { std::cout << "Der::p1\n"; }
};

这样子类就可以调用基类的“process(int x,float b)”函数了。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值