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();

  • 1
  • 2
  • 3
  • 下一页

相关内容