C++:同名隱藏和賦值兼容規則

1、同名隱藏

同名隱藏,即在C++的繼承中,只要子類的函數名和父類的函數名相同,子類中的函數將會隱藏全部父類中和子類的成員函數同名的函數ios

特別注意:函數

和函數之間的重載不一樣,這裏只要求函數的名字相同,而對函數的參數列表是否相同不作要求。話句話說父類中和子類的成員函數名相同但參數列表不一樣的成員函數也會被隱藏spa

示例:指針

 1 #include<iostream>
 2 using namespace std;
 3 class Father{ //父類
 4 public:
 5     Father()=default;
 6     Father(int v):value(v){}
 7     void show(){
 8         cout<<"調用Father類中的成員函數show()"<<endl; 
 9     }
10     void show(int a){
11         cout<<"調用Father類中的成員函數show(int)"<<endl; 
12     }
13 private:
14     int value; 
15 }; 
16 
17 class Son:public Father{ //子類
18 public:
19     Son()=default;
20     Son(int v):value(v){}
21     void show(){  //對父類中的方法show()和方法show(int)進行了同名隱藏 22         cout<<"調用Son類中的成員函數show()"<<endl; 
23     }
24 private:
25     int value; 
26 };
27 
28 int main(){
29     Son s;
30     s.show();
31     //s.show(1); //錯誤:方法show(int)被同名隱藏了 32     s.Father::show(); //父類的方法show()和方法show(int)確實被子類Son繼承了,但被子類Son中的同名方法show()給隱藏了,沒法經過子類的對象顯式的調用 33     s.Father::show(1);
34     return 0;
35 } 

 

2、賦值兼容規則

所謂賦值兼容規則,即在任何須要基類對象的地方均可以用該基類的公有派生類的對象來代替,它主要包括如下狀況:code

• 派生類的對象能夠賦值給基類的對象,此時的賦值操做主要是把派生類對象中所包含的對應基類的子對象賦值給基類對象對象

特別注意:blog

反過來(即將基類對象賦值給派生類對象)不行,由於派生類對象中的新成員將無值可賦繼承

示意圖:io

示例:class

 1 #include<iostream>
 2 using namespace std;
 3 class Father{ //父類
 4 public:
 5     Father()=default;
 6     Father(int value):father_value(value){}
 7     void show(){
 8         cout<<"Father類中的成員變量的值爲:"<<father_value<<endl;
 9     }
10 private:
11     int father_value; 
12 };
13 
14 class Son:public Father{ //子類
15 public:
16     Son()=default;
17     Son(int value):Father(value),son_value(value){}
18     void show(){
19         cout<<"Son類中的成員變量的值爲:"<<son_value<<endl;
20     }
21 private:
22     int son_value; 
23 };
24 
25 int main(){
26     Father father(10);
27     Son son(20);
28 father=son; //將派生類對象賦值給基類對象
29     father.show();
30     return 0; 
31 }

• 能夠將一個派生類對象的地址賦值給其基類的指針變量

特別注意:

1.只能經過該指針訪問派生類中由基類繼承來的隱藏對象,不能訪問派生類中的新成員

2.此操做的本質是將指針指向派生類中由基類繼承來的隱藏對象

3.不能將一個基類對象的地址賦值給一個派生類的指針變量

示意圖:

示例:

 1 #include<iostream>
 2 using namespace std;
 3 class Father{ //父類
 4 public:
 5     Father()=default;
 6     Father(int value):father_value(value){}
 7     void show(){
 8         cout<<"Father類中的成員變量的值爲:"<<father_value<<endl;
 9     }
10 private:
11     int father_value; 
12 };
13 
14 class Son:public Father{ //子類
15 public:
16     Son()=default;
17     Son(int value):Father(value),son_value(value){}
18     void show(){
19         cout<<"Son類中的成員變量的值爲:"<<son_value<<endl;
20     }
21     void new_func(){
22         cout<<"調用Son類中的成員方法:new_func()"<<endl;
23     }
24 private:
25     int son_value; 
26 };
27 
28 int main(){
29     Son son(20);
30 Father *ptr=&son;//將派生類對象的地址賦值給基類類型的指針 31 ptr->show(); 32 //ptr->new_func(); //錯誤:只能經過該指針訪問派生類中由基類繼承來的隱藏對象,不能訪問派生類中的新成員
33     return 0; 
34 }

• 派生類對象能夠初始化基類的引用

特別注意:

1.只能經過該引用訪問派生類中由基類繼承來的隱藏對象,不能訪問派生類中的新成員

2.此操做的本質是爲派生類中由基類繼承來的隱藏對象起一個別名

3.不能用基類對象來初始化派生類的引用

示意圖:

示例:

 1 #include<iostream>
 2 using namespace std;
 3 class Father{ //父類
 4 public:
 5     Father()=default;
 6     Father(int value):father_value(value){}
 7     void show(){
 8         cout<<"Father類中的成員變量的值爲:"<<father_value<<endl;
 9     }
10 private:
11     int father_value; 
12 };
13 
14 class Son:public Father{ //子類
15 public:
16     Son()=default;
17     Son(int value):Father(value),son_value(value){}
18     void show(){
19         cout<<"Son類中的成員變量的值爲:"<<son_value<<endl;
20     }
21     void new_func(){
22         cout<<"調用Son類中的成員方法:new_func()"<<endl;
23     }
24 private:
25     int son_value; 
26 };
27 
28 int main(){
29     Son son(20);
30 Father &father=son;//用派生類來初始化基類的引用 31 father.show(); 32 //father.new_func(); //錯誤:只能經過該引用訪問派生類中由基類繼承來的隱藏對象,不能訪問派生類中的新成員
33     return 0; 
34 }

相關文章
相關標籤/搜索