栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

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

一 问题

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

class base {
public:
    virtual void process(int x) {qDebug() << "base::p1n";};
    virtual void process(int a,float b) {qDebug() << "base::p2n";}
protected:
    int pd;
    float pb;
};

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

class derived: public base
{
public:
    virtual void process(int x) { std::cout << "Der::p1n"; }
};

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::p1n"; }
    virtual void process(int x,float b) { std::cout << "Der::p2n"; }
};

似乎有点蠢

2. 使用using来解决
class derived: public base
{
public:
    using base::process;
    virtual void process(int x) { std::cout << "Der::p1n"; }
};

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/779212.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号