C++ 派生类覆盖重载基类函数

派生类希望基类重载函数可见,情况有三种:

    a)派生类中覆盖某个版本,则某个版本可见,全部都覆盖重写,则全部版本可见。

    b)派生类中一个也不覆盖,则全部基类版本可见。

    c)派生类需要添加新的重载版本,同时又需要可见基类的重载版本,此时并不是必须全部覆盖重写全部版本。可在派生类中用using声明基类重载的函数。

      说明:对派生类没有重新定义的重载版本的访问实际上是对using声明点的访问。

两种注意点:

    a)指向派生类的基类指针或引用,不可调用派生类中的重载函数。

      原因:静态编译名字查找先于类型检查,在基类中找到同名函数,就不喊在派生类中继续找,而基类不存在目标调用形式的函数

    b)若不用using声明基类的重载版函数,派生类对象不可调用基类的重载版本。

      原因:派生类的函数,隐藏了基类的同名函数。

h----------------------
#ifndef DEMOCLASS_H
#define DEMOCLASS_H

#include <iostream>
using namespace std;

class DemoClass
{
public:
    DemoClass();
    void func(int);
    void func(char);
};

class DerivedClass:public DemoClass
{
 public:
     using DemoClass::func;
     void func(string);
};


#endif // DEMOCLASS_H


cpp---------------------------
#include "democlass.h"

DemoClass::DemoClass()
{
    cout<<"construct..."<<endl;
}

void DemoClass::func(int)
{
    cout<<"DemoClass func(int)..."<<endl;
}

void DemoClass::func(char)
{
    cout<<"DemoClass func(char)..."<<endl;
}

void DerivedClass::func(string)
{
    cout<<"DerivedClass func(string)..."<<endl;
}


main----------------------
#include <QCoreApplication>
#include "democlass.h"

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

    DemoClass *demo;
    DerivedClass derived;
    demo = &derived;

    cout<<"...Demo object that point to Derived access func..."<<endl;
    demo->func(1);
    demo->func('a');

    cout<<endl<<"...derived object access func..."<<endl;
    derived.func(1);
    derived.func('a');
    derived.func("abc");
    return a.exec();
}



运行结果--------------------
construct...
...Demo object that point to Derived access func...
DemoClass func(int)...
DemoClass func(char)...

...derived object access func...
DemoClass func(int)...
DemoClass func(char)...
DerivedClass func(string)...

猜你喜欢

转载自www.cnblogs.com/azbane/p/11073125.html