美文网首页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++ 子类不能重载父类函数 解决方法

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

  • C++派生类的友元函数,派生类的析构函数

    一、赋值兼容 运算符重载函数需要访问父类的私有成员,运算符重载函数是父类的友元函数,子类继承了父类,子类也可以使用...

  • 2020-07-07-《C++虚函数》

    虚函数可以让子类重写函数 子类重写父类中的虚函数 重写与重载的区别?

  • C++ 重载 重定义 重写

    重载:在同一个类中,相同的函数名,不同的参数,称为函数重载,但是不能通过函数返回类型来判断。 重定义:在子类继承父...

  • C++中重写、重载、重定义

    函数重载 必须在同一个类中进行 子类无法重载父类的函数 函数名字相同,参数不同,返回值可以不同 重载在编译期间根据...

  • java-多态中方法重载和方法重写

    1.当子类重载父类的方法,父类不能引用该方法。只能引用自己的方法。2.当子类重写父类的方法,父类引用指向子类对象时...

  • C++中的多重继承

    多重继承 C++支持编写多重继承的代码一个子类可以拥有多个父类子类拥有所有父类的成员变量子类继承所有父类的成员函数...

  • c++温故知新2(虚函数表)

    c++多态由虚函数实现:子类覆盖父类的虚函数,然后声明一个指向子类对象的父类指针p,当用p调用虚函数时,调用的是子...

  • 关于构造函数

    父类有参构造函数的作用 子类不能继承父类的构造函数 子类继承父类后,如果想要初始化,必须保证父类已经被构造,此时就...

  • 总结

    1,重载和重写的区别:重载:允许存在一个以上的同名函数,只要它们的参数类型不同即可。重写:当子类继承父类,沿袭了父...

网友评论

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

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