• c++继承:同名隐藏


    不同作用域声明的标识符的可见性原则:

    如果存在两个或者多个具有包含关系的作用域,外层声明了一个标识符,而内层没有再次声明同名标识符,那么外层标识符在内层依然可见;如果在内层声明了同名标识符,则外层标识符在内层不可见,这时称内层标识符隐藏了外层同名标识符,这种现象称为隐藏规则。

    在类的派生层次结构中,基类的成员和派生类新增的成员都具有类作用域。二者的作用范围不同,是相互包含的两个层,派生类在内层。这时,如果派生类声明了一个和某个基类成员同名的新成员,派生的新成员就隐藏了外层同名成员,直接使用成员名只能访问到派生类的成员。

    如果派生类中声明了与基类同名的新函数,即使函数的参数表不同,从基类继承的同名函数的所有重载形式也都被隐藏。如果要访问被隐藏的成员,就需要使用类作用域分辨符和基类名来限定。

    作用域分辨符,就是“::”,它可以用来限定要访问的成员所在的类的名称。一般的使用形式是:

    类名::成员名

    类名:成员名(参数表)

     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

  • 相关阅读:
    php socket 读取缓存区域
    PHP依赖注入的作用
    谷歌浏览器调试文字都变成font标签的解决方法
    php socket 同步异步堵塞非堵塞的区别
    css3中background-size中的cover与contain的区别
    css3 line-height:0的作用
    RDD的创建方式
    Serializable序列化操作解惑
    SparkCore分布式计算模拟
    spark不同环境下计算pi值
  • 原文地址:https://www.cnblogs.com/zengtx/p/6382270.html
Copyright © 2020-2023  润新知