歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> C++繼承:同名隱藏、覆蓋,虛函數

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

日期:2017/3/1 10:20:06   编辑:Linux編程

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

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

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

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

類名::成員名

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

關於同名隱藏的驗證:

代碼1:

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

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

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

Copyright © Linux教程網 All Rights Reserved