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)...

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM