美文网首页C++ 杂记C++
C++ 子类不能重载父类函数 解决方法

C++ 子类不能重载父类函数 解决方法

作者: 赵者也 | 来源:发表于2017-01-17 22:46 被阅读33次

    注意:本文中代码均使用 Qt 开发编译环境
    子类不能重载父类函数,常常是像下面的例子中这样:

    #include <QCoreApplication>
    #include <QDebug>
    
    class B {
    public:
        int f(int i) {
            qDebug() << "f(int): ";
            return i+1;
        }
        // ...
    };
    
    class D : public B {
    public:
        double f(double d) {
            qDebug() << "f(double): ";
            return d+1.3;
        }
        // ...
    };
    
    int main(int argc, char *argv[])
    {
        QCoreApplication a(argc, argv);
    
        D* pd = new D;
        qDebug() << pd->f(2);
        qDebug() << pd->f(2.3);
    
        return a.exec();
    }
    

    上面的例子的运行结果:

    调用结果

    程序运行结果是:

    注意,此处是
    f(double):
    3.3
    而不是(错误地)猜想的
    f(int):
    3
    之后的可以理解
    f(double):
    3.6

    换句话说,在D和B之间没有重载发生。你调用了pd->f(),编译器就在D的名字域里找啊找,找到double f(double)后就调用它了。编译器懒得再到B的名字域里去看看有没有哪个函数更符合要求。记住,在C++中,没有跨域重载——继承类和基类虽然关系很亲密,但也不能坏了这条规矩。详见《The Design and Evolution of C++》或者《The C++ Programming Language》第三版。

    不过,如果你非得要跨域重载,也不是没有变通的方法——你就把那些函数弄到同一个域里来好了。使用一个using声明就可以搞定。

    我们修改D类,如下所示:

    class D : public B {
    public:
        using B::f; // make every f from B available
        double f(double d) {
            qDebug() << "f(double): ";
            return d+1.3;
        }
        // ...
    };
    

    运行结果图:

    重载正确的结果

    这样一来,结果就是
    f(int):
    3
    f(double):
    3.6

    重载发生了——因为D中的那句 using B::f 明确告诉编译器,要把B域中的f引入当前域,请编译器“一视同仁”。

    相关文章

      网友评论

        本文标题:C++ 子类不能重载父类函数 解决方法

        本文链接:https://www.haomeiwen.com/subject/xkrvbttx.html