1. 程式人生 > >通過使用using 子類重載父類方法

通過使用using 子類重載父類方法

prime fun 一個 全部 對象 span csdn 重新定義 聲明

轉自:https://blog.csdn.net/bama2488313716/article/details/51704944

使用using 申明式可以使得父類中的同名函數在子類中可見,從而實現函數重載。實現代碼如下所示:

#include <iostream>
using namespace std;

class Base
{
public:
void fun(int data)
{
cout<<"int"<<endl;
}
};

class Derivd:public Base
{
public:
using Base::fun;
void fun(double data)
{
cout<<"double"<<endl;
}
};

int main()
{
Derivd d;
d.fun(12);
}

這裏using申明式可以使得父類中被遮掩住的同名函數在子類中可見,從而在子類中實現函數重載。

轉自:https://blog.csdn.net/aa13058219642/article/details/51842745

其實,並沒有‘子類“重載”父類的方法’這種說法。

《C++Primer Plus》 中說道:

  • 如果基類聲明被重載了,則應該在派生類中重新定義所有的基類版本。
  • 如果在派生類中只重新定義一個版本,其他版本將會被隱藏,派生類對象將無法使用它們。

簡而言之,重新定義函數,並不是重載。在派生類中定義函數,將不是使用相同的函數特征標覆蓋基類聲明,而是隱藏同名的基類方法,不管參數的特征標如何。

舉例:

    class A{
        virtual print(void);
        virtual print(int a);
    }

    class B : public A{
        virtual print(float a);
    }

    int main(){
        B* b = new B();
        b->print(); //這裏會報參數過少的錯誤
    }

如同《C++Primer Plus》 中說的,B類重新定義了print(float a),所以A類定義的兩個print都被隱藏無法使用了

但是有時我們確實有這樣的需求,父類的提供的方法重載不能滿足我們的要求,我們要在子類拓展該方法,但是我們又不想全部重寫,那這時改怎麽辦呢?

加一句話:using A::print;

    class A{
    public:
        virtual print(void);
        virtual print(int a);
    }

    class B : public A{
    public:
        using A::print; //<======加這一句
        virtual print(float a);
    }

    int main(){
        B* b = new B();
        b->print(); //這裏就可以用了
    }

這句話的作用,其實就是把父類print的作用域拓展到子類

所以說,這種做法正確的說法應該是:子類擴展父類的方法 ….大概吧

通過使用using 子類重載父類方法