不同作用域声明的标识符的可见性原则:
如果存在两个或者多个具有包含关系的作用域,外层声明了一个标识符,而内层没有再次声明同名标识符,那么外层标识符在内层依然可见;如果在内层声明了同名标识符,则外层标识符在内层不可见,这时称内层标识符隐藏了外层同名标识符,这种现象称为隐藏规则。
在类的派生层次结构中,基类的成员和派生类新增的成员都具有类作用域。二者的作用范围不同,是相互包含的两个层,派生类在内层。这时,如果派生类声明了一个和某个基类成员同名的新成员,派生的新成员就隐藏了外层同名成员,直接使用成员名只能访问到派生类的成员。
如果派生类中声明了与基类同名的新函数,即使函数的参数表不同,从基类继承的同名函数的所有重载形式也都被隐藏。如果要访问被隐藏的成员,就需要使用类作用域分辨符和基类名来限定。
作用域分辨符,就是“::”,它可以用来限定要访问的成员所在的类的名称。一般的使用形式是:
类名::成员名
类名:成员名(参数表)
1 #include<iostream> 2 using namespace std; 3 4 class A 5 { 6 public: 7 void print2(){cout << "A print2!" << endl;} 8 }; 9 10 class B : public A 11 { 12 public: 13 void print2(int x) 14 { 15 cout << "B print2 !" << x << endl; 16 } 17 }; 18 19 int main() 20 { 21 B b; 22 b.print2(); 23 return 0; 24 }
编译失败:
[zengtx@cmm03node02 test]$g++ a1.cxx a1.cxx: In function ?.nt main()?. a1.cxx:22: error: no matching function for call to ?.::print2()? a1.cxx:13: note: candidates are: void B::print2(int)
由结果可知,已经不能从B的对象中直接用函数名访问print2()了。
将b.print2();改为b.A::print2();
编译通过,执行结果为:
[zengtx@cmm03node02 test]$./a.out
A print2!
虚函数等(继续学习)
https://my.oschina.net/hnuweiwei/blog/280894
http://blog.csdn.net/haoel/article/details/1948051