Effective C++ 条款33

本条款讲的是关于同名的变量或函数在继承体系中的调用问题。
如下例子:

class Base
{
     public:
     virtual void mf1();
     virtual void mf1(int);
     virtual void mf2();
     void mf3();
     void mf3(int);
     void mf4();
};

class Derived: public Base
{
     public:
     virtual void mf1();
     virtual void mf2();
     void mf3();  
};

Derived d;
int x;
d.mf1();//调用Drived::mf1();
d.mf1(x);//调用失败Base中的mf1(int)被Drived::mf1()函数隐藏。
d.mf2();//调用Drived::mf2();
d.mf3();//调用Drived::mf3();
d.mf3(x);//调用失败Base中的mf3(int)被Drived::mf3()函数隐藏。
d.mf4();//调用Base::mf4();

由上面的代码可知,派生类中的函数隐藏了所有在基类中的同名函数,无论函数参数列表是不是相同。
为了解决这种问题,只要在public作用域下调用using声明就能解决这种问题。如下代码:

class Base
{
     public:
     virtual void mf1();
     virtual void mf1(int);
     virtual void mf2();
     void mf3();
     void mf3(int);
     void mf4();
};

class Derived: public Base
{
     public:
     using Base::mf1;
     using Base::mf3;
     virtual void mf1();
     virtual void mf2();
     void mf3();  
};

Derived d;
int x;
d.mf1();//调用Drived::mf1();
d.mf1(x);//调用Base中的mf1(int)。
d.mf2();//调用Drived::mf2();
d.mf3();//调用Drived::mf3();
d.mf3(x);//调用Base中的mf3(int)。
d.mf4();//调用Base::mf4();

public 继承的意义是派生类继承基类的所有,包括函数和变量,为了达到拥有并使用的目的,我们必须记住以上所说的特性。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值