C++和Java中类继承同名函数的区分
C++和Java的派生類對于與基類同名的函數有著不同的處理方式。
在C++中,假設基類中有一個dis()函數,而派生類又定義了一個dis()函數,這時候在派生類對象中會將基類的dis()函數屏蔽掉,上代碼:
class a { private:int num;float floatnum; public:void dis(void){cout << "這是基類的dis方法()" << endl;} } class b : public a { public:void dis(void i){cout << "這是派生類的dis方法" << endl;} };此時使用main函數來進行b類的實例化
int main(void) {a classa;b classb;classb.dis(); }這樣的結果是調用了派生類的方法,很明顯派生類中與基類同名的dis方法在派生類對象classb調用dis()方法的時候,盡管派生類已經繼承了基類所有的公有方法,但派生類屏蔽了基類中與之同名的dis方法。
那么有沒有可能是派生類只屏蔽基類中與之特征標完全相同的函數呢?很遺憾,并不是這樣,以下代碼:
#include<iostream> using namespace std; class a { private:int num;float floatnum; public:void dis(void){cout << "這是基類的dis() 方法" << endl;}void dis(int i){cout << "這是基類的dis(int i) 方法" << endl;}void dis(char c){cout << "這是基類的dis(char c) 方法" << endl;} }; class b : public a { public:void dis(void){cout << "這是派生類的dis方法" << endl;} };這段代碼中我在基類中重載了多個dis()方法,而在派生類中定義了一個dis方法,現在來調用main函數:
int main(void) {a classa;b classb;classb.dis('c'); }main函數中,我意圖使用一個字符作為dis()的參數來使派生類對象調用基類中的dis(char c)版本,但還未運行,IDE本身就給出了錯誤提示:函數中的參數太多。
這個錯誤的意思就是,我使用的這個dis()函數它不接受參數,這從側面證明了C++中對于派生類與基類同名的函數,派生類對象在使用這個同名函數的時候是將基類中所有的同名函數全部屏蔽掉(不管它們的返回類型,參數列表是否一致),在派生類對象中無法使用這些已經被公有繼承過來的同名函數,如果非要使用基類中的同名函數,就得將函數聲明為虛的,這又是一回事,這里不做深入探討。
接下來來看Java,Java中對待基類與派生類的同名函數顯然不同于C++,以下代碼
class T {public void dis(int i) {System.out.println("這是基類的dis(int i)方法");}public void dis(char c) {System.out.println("這是基類的dis(char c)方法");} } public class Test extends T{public void dis(int i) {System.out.println("這是派生類的dis(int i)方法");}public static void main(String[] args) {Test t = new Test();t.dis('c');} }注意下劃線,這段代碼在Java中完全正確,它直接調用了基類T中的public void dis(char c)這個同名函數的版本,也就是說,Java在繼承類的時候,是不會自動屏蔽基類中與派生類同名的函數的,但這里又有一點特例,我在基類T中有一個public void dis(int i)的函數,而在派生類Test中也有一個特征標與之完全相同的函數,那么當我使用這樣的代碼:? ? t.dis( 1 ), 會發生什么?
很顯然,這樣會調用派生類的public void dis(int i)版本,這在Java中是覆蓋了基類的定義,也可以說是屏蔽。
總之,C++和Java在類繼承中對待基類和派生類中的同名函數,其處理方法是不同的,C++是直接屏蔽掉基類中所有的與派生類同名的函數,而Java與此不同,Java不會屏蔽,在派生類對象中,只要使用不同的參數列表,依然可以區分出該同名函數來自基類還是派生類。
總結
以上是生活随笔為你收集整理的C++和Java中类继承同名函数的区分的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于《Java编程思想》的简单纠正
- 下一篇: php vendor路径,php – 如