C++ 子类函数对父类同名函数的覆盖

注意:本文中代码均使用 Qt 开发编译环境
请查看下面的代码,并回答注释中的问题

#include 
#include 

class B
{
public:
    void f(int) const {
        qDebug() << "B.int" << endl;
    }

    void f(double) const {
        qDebug() << "B.double" << endl;
    }
};

class D: public B
{
public:
    void f(void*) const {
        qDebug() << "D.void" << endl;
    }
};

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    D d;
    d.f(0);     //1.调用那个函数?
    d.f(1);     //2.调用那个函数?
    d.f(0.1);   //3.调用那个函数?

    return a.exec();
}

答案:3个调用全部调用子类的f(void*)。但由于后两个不能转换为void*,编译出错。void*是可以指向
任何类型的指针。C++中,只有int 0可以转换为指针型,其余均不可以,所以出错。

关于子类函数对父类函数的覆盖:
在C++类里面,存在两个概念,一个是重载,一个是覆盖
重载只是在类的内部存在,不会传导到父类和子类中间。即便是一个函数声明virtual,也是这样。
如果一个类,存在和父类相同的函数,那么,这个类将会覆盖父类方法,除非你在调用的时候,强制转换父类类型,否则试图对子类和父类做类似重载的调用是不能成功的。

你可能感兴趣的:(C++ 子类函数对父类同名函数的覆盖)