博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
c/c++ 继承与多态 子类隐藏父类的同名非虚函数
阅读量:4574 次
发布时间:2019-06-08

本文共 1621 字,大约阅读时间需要 5 分钟。

问题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 
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

1414315-20181106214320230-961379709.jpg

本人微信:xiaoshitou5854

转载于:https://www.cnblogs.com/xiaoshiwang/p/10213203.html

你可能感兴趣的文章
双飞翼布局和圣杯布局
查看>>
java并发编程之CountDownLatch与CyclicBarrier
查看>>
AOJ 0525 - Osenbei
查看>>
iOS 直播-闪光灯的使用
查看>>
关于 Failed to establish a new connection: [Errno 11004] getaddrinfo failed',))的问题
查看>>
python数据类型之间的转换
查看>>
[T-ARA][I'm so bad]
查看>>
win7,win10获取屏幕缩放适应截图
查看>>
MySQL常用命令
查看>>
python3实现合并两个有序数组
查看>>
InventTrans中的状态跟踪
查看>>
python flsak 框架
查看>>
h5页面调起微信支付
查看>>
loadrunner中pacing设置01
查看>>
python 选课系统
查看>>
C语言复习: 二级指针和多级指针
查看>>
从零系列--node爬虫利用进程池写数据
查看>>
C语言中二维数组行指针是什么
查看>>
sed 常见用法
查看>>
spring boot
查看>>