歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

C++繼承:同名隱藏、覆蓋,虛函數

不同作用域聲明的標識符的可見性原則:

如果存在兩個或多個具有包含關系的作用域,外層聲明了一個標識符,而內層沒有再次聲明同名標識符,那麼外層標識符在內層依然可見,如果在內層聲明了同名標識符,則外層標識符在內層不可見,這時稱內層標識符隱藏了外層同名標識符,這種現象稱為隱藏規則。

在類的派生層次結構中,基類的成員和派生類新增的成員都具有類作用域。二者的作用范圍不同,是相互包含的兩個層,派生類在內層。這時,如果派生類聲明了一個和某個基類成員同名的新成員,派生的新成員就隱藏了外層同名成員,直接使用成員名只能訪問到派生類的成員。如果派生類中聲明了與基類同名的新函數,即使函數的參數表不同,從基類繼承的同名函數的所有重載形式也都被隱藏。如果要訪問被隱藏的成員,就需要使用類作用域分辨符和基類名來限定。

作用域分辨符,就是"::",它可以用來限定要訪問的成員所在的類的名稱。一般的使用形式是:

類名::成員名

類名::成員名(參數表)

關於同名隱藏的驗證:

代碼1:

  1. #include<iostream>   
  2. using namespace std;  
  3. class A  
  4. {  
  5.     public:  
  6.   
  7.   
  8.     void print2(){  
  9.         cout<<"A print2 !"<<endl;  
  10.     }  
  11. };  
  12.   
  13.   
  14. class B:public A  
  15. {  
  16.       
  17.     public:  
  18.   
  19.   
  20.     void print2(int x){  
  21.         cout<<"B print2 !"<<x<<endl;  
  22.     }  
  23. };  
  24.   
  25.   
  26. int main(){  
  27.     B b;  
  28.     b.print2();  
  29.     return 0;  
  30. }  

    由結果可知已經不能直接從B的對象中直接用函數名訪問print2()了。

    將b.print2();  改為: b.A::print2();

Copyright © Linux教程網 All Rights Reserved