c/c++ 继承与多态 子类隐藏父类的同名非虚函数
程序员文章站
2022-05-25 19:55:16
问题1:若类A里有公有成员方法int fcn(),类B公有继承类A,并类B里有公有成员方法int fcn(int),可以在用户代码里,用类B的对象调用类A的int fcn()吗?? 不可以,编译出错,提示类B里没有int fcn()。 是不是感觉很奇怪,类B公有继承了类A,按理说,类A的公有成员,是 ......
问题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
上一篇: [PHP] swoole的安装和简单使用
下一篇: 一看你就是会过日子的姑娘