通過使用using 子類重載父類方法
轉自: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 子類重載父類方法