zoukankan      html  css  js  c++  java
  • 避免遮掩继承而来的名称

         C++中类与类之间存在着两种名称遮盖关系,变量遮盖、函数遮盖。其本质都是名字的查找方式导致的,当编译器要找一个名字,它一旦找到一个相符的名字,就不会往下找了,因此遮掩本质上是优先查找那个名字的问题。
        查找名字时,编译器先从子类开始,一旦找到了,就不再继续查找。无论普通函数,虚函数,还是纯虚函数,结果都是输出子类的函数调用。 避免遮掩继承而来的名称是因为,你在使用public继承而又不继承那些重载函数,就是违反base和derive class之间的 is 关系。

        如果非要访问父类的方法,用两种方法可以实现

        1. 使用using Base::func();声明
        2. 定义转交函数
    1. //:采用using声明,使查找范围扩大至父类指定的函数:
    2. class Base
    3. {
    4. public:
    5. void CommonFunction(){cout << "Base::CommonFunction()" << endl;}
    6. void virtual VirtualFunction(){cout << "Base::VirturalFunction()" << endl;}
    7. void virtual VirtualFunction(int x){cout << "Base::VirtualFunction() With Parms" << endl;}
    8. void virtual PureVirtualFunction() = 0;
    9. };
    10. class Derived: public Base
    11. {
    12. public:
    13. using Base::VirtualFunction; // 第一级查找也要包括Base::VirtualFunction
    14. void CommonFunction(){cout << "Derived::CommonFunction()" << endl;}
    15. void virtual VirtualFunction(){cout << "Derived::VirturalFunction()" << endl;}
    16. void virtual PureVirtualFunction(){cout << "Derived::PureVirtualFunction()" << endl;}
    17. };
    18. int main()
    19. {
    20. Derived d;
    21. d.VirtualFunction(3); // 这样没问题了,编译器会把父类作用域里面的函数名VirtualFunciton也纳入第一批查找范围,这样就能发现其实是父类的函数与main中的调用匹配得更好(因为有一个形参),这样会输出Base::VirtualFunction() With Parms
    22. return 0;
    23. }



    1. //:使用转交函数强制指定父类的作用域
    2. class Base
    3. {
    4. public:
    5. void CommonFunction(){cout << "Base::CommonFunction()" << endl;}
    6. void virtual VirtualFunction(){cout << "Base::VirturalFunction()" << endl;}
    7. void virtual VirtualFunction(int x){cout << "Base::VirtualFunction() With Parms" << endl;}
    8. void virtual PureVirtualFunction() = 0;
    9. };
    10. class Derived: public Base
    11. {
    12. public:
    13. using Base::VirtualFunction;
    14. void CommonFunction(){cout << "Derived::CommonFunction()" << endl;}
    15. void virtual VirtualFunction(){cout << "Derived::VirturalFunction()" << endl;}
    16. void virtual PureVirtualFunction(int x){cout << "Derived::PureVirtualFunction()" << endl;}
    17. void virtual VirtualFunction(int x){Base::VirtualFunction(x)};
    18. };
    19. int main()
    20. {
    21. Derived d;
    22. d.VirtualFunction(3); // 输出Base::VirtualFunction() With Parms
    23. return 0;
    24. }

    总结: 派生类的名字会遮盖基类的名字
                为了让遮盖的名字重见天日,可以用using声明或者转交函数。




  • 相关阅读:
    红黑树(二)插入
    HDU 3415 Max Sum of Max-K-sub-sequence(单调队列)
    Codeforces 433 Div.2(A、B、C、D)
    Codeforces 846D Monitor(简单二分+二维BIT)
    hihoCoder 1403 后缀数组一·重复旋律(后缀数组+单调队列)
    CF 787D Legacy(线段树思想构图+最短路)
    HDU 6165 FFF at Valentine(Tarjan缩点+拓扑排序)
    Codeforces 165E Compatible Numbers(二进制+逆序枚举)
    Codeforces 672D Robin Hood(二分好题)
    HITOJ 2739 The Chinese Postman Problem(欧拉回路+最小费用流)
  • 原文地址:https://www.cnblogs.com/chengkeke/p/5417380.html
Copyright © 2011-2022 走看看