Item 33 派生时小心重名函数族

本文探讨了C++中名字覆盖的问题,包括普通变量的名字覆盖和派生时发生的名字覆盖现象,并介绍了如何通过using声明来解决这些问题。

1> 普通变量的名字覆盖

int x; void someFunc() { double x; // 虽然是double,但对编译器而言,还是和 std::cin >> x; // 上面的int重名,此处只能访问double的 }

2> 派生时发生的名字覆盖

class Base { private: int x; public: virtual void mf1() = 0; virtual void mf1(int); virtual void mf2(); void mf3(); void mf3(double); ... }; class Derived: public Base { public: virtual void mf1(); void mf3(); void mf4(); ... }; Derived d; int x; ... d.mf1(); // 调用Derived::mf1 d.mf1(x); // 编译错!基类的mf1(int)因名字被覆盖,编译器找不到 d.mf2(); // 调用Base::mf2 d.mf3(); // 调用Derived::mf3 d.mf3(x); // 编译错!mf3也同样被覆盖了

只是因为名字被覆盖,就导致子类不能派生基类的一些函数。
编译器如此处理,是为了在你重定义“公有派生 ”来的函数族时,不小心漏掉其中一两个。但我们在实践中,常常是并不想重定义所有的函数的。
解决的方法是使用using:

class Derived: public Base { public: using Base::mf1; // 让mf1和mf3在子类中可用 using Base::mf3; // 并且是public属性 ...

加上这两句,编译运行就没有问题了。

私有继承 的时候,情况是不同的:

class Base { public: virtual void mf1() = 0; virtual void mf1(int); ... }; class Derived: private Base { public: virtual void mf1() { Base::mf1(); } ... }; Derived d; int x; d.mf1(); d.mf1(x); // 私有继承,外部不能使用

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值