• c/c++ 继承与多态 子类隐藏父类的同名非虚函数


    问题1:若类A里有公有成员方法int fcn(),类B公有继承类A,并类B里有公有成员方法int fcn(int),可以在用户代码里,用类B的对象调用类A的int fcn()吗??

    不可以,编译出错,提示类B里没有int fcn()。

    是不是感觉很奇怪,类B公有继承了类A,按理说,类A的公有成员,是可以通过类B的对象来调用的。

    原因是:子类重载了父类的int fcn(),注意是名字相同,参数不一样。结果导致,对于类B的对象来说,隐藏了父类A的同名方法int fcn()

    #include <iostream>
    
    class Base{
    public:
      virtual int fcn(){
        std::cout << "base fcn()" << std::endl;
      }
    };
    
    class D1 : public Base{
      
    public:
      int fcn(int){//形参与Base的fcn不一致,所以隐藏了Base的fcn
        std::cout << "D1 fcn(int)" << std::endl;
      }
      virtual void f2(){
        std::cout << "D1 f2()" << std::endl;
      }
    };
    
    class D2 : public D1{
    public:
      int fcn(int){//隐藏了D1::fcn(int)
        std::cout << "D2 fcn(int)" << std::endl;
      }
      int fcn(){//覆盖了Base的虚函数fcn
        std::cout << "D2 fcn()" << std::endl;
      }
      void f2(){//覆盖了D1的虚函数f2
        std::cout << "D2 f2()" << std::endl;
      }
    };
    
    int main(){
      Base b;
      D1 d1;
      D2 d2;
    
      //原因是:子类重载了父类的int fcn(),注意是名字相同,参数不一样。结果导致,对应类B的对象来说,隐藏了父类A的同名方法int fcn()
      d1.fcn();//error,不可以,编译出错,提示类B里没有int fcn()。
    }
    
    

    修改方法:使用using

    class D1 : public Base{
      
    public:
      using Base::fcn;//使用using后,就把Base里的,所有fcn为名字的成员方法,都引入到D1里面,所以就可以使用D1的对象来调用Base里的任何fcn为名字的成员方法了。
      int fcn(){
        std::cout << "D1 fcn()" << std::endl;
      }
      int fcn(int){//形参与Base的fcn不一致,所以隐藏了Base的fcn
        std::cout << "D1 fcn(int)" << std::endl;
      }
      virtual void f2(){
        std::cout << "D1 f2()" << std::endl;
      }
    };
    
    

    问题2:若Base里有多个fcn方法(名字相同,参数不一样),那么如果在Base的子类,只打算覆盖某个Base的fcn方法,而且还想让Base类里其他没有被覆盖的fcn方法也可以被调用,那应该怎么办?

    办法1:在子类里覆盖所有Base的fcn方法,在方法体里,直接调用Base::fcn,但是这样太麻烦了,每一个都要覆盖。有没有好的办法?

    办法2:使用using。只需要在子类的public下,using Base::fcn,就达到了办法1的效果。

    c/c++ 学习互助QQ群:877684253

    本人微信:xiaoshitou5854

  • 相关阅读:
    项目原型设计
    项目选题报告 (基于云的胜利冲锋队)
    基于云的胜利冲锋队 团队团队展示
    团队作业第三次-项目原型设计
    团队作业第二次-项目选题报告
    团队作业第一次-团队团队展示
    周测、代码
    异常
    5.13重点
    接口
  • 原文地址:https://www.cnblogs.com/xiaoshiwang/p/10213203.html
Copyright © 2020-2023  润新知