重新定义隐藏方法

假设创建了如下所示的代码:

class Dwelling

{

public:

     virtual void showperks(int a) const;

....

};

 

class Hovel : public Dwelling

{

public:

     virtual void showperks() const;

....

};

 

这将导致问题,可能会出现类似于下面这样的编译警告:

Warning: Hovel::showperks(void) hides Dwelling::showperks(int).

但是不管 怎么样,代码将具有如下含义:

Hovel trump;

trump.showperks();  // valid

trump.showperks(5);// invalid

    新定义将showperks()定义为一个不接受任何参数的函数。重新定义不会生成函数的两个重载版本,而是隐藏了接受一个int参数的基类版本。简而言之,重新定义继承的方法并不是重载。如果在派生类中重新定义函数,将不是使用相同的函数特征标覆盖基类声明,而是隐藏同名的基类方法,不管参数特征标如何。

    这引出了两条经验规则:第一,如果重新定义继承的方法,应确保与原来的原型完全相同,但如果返回类型是基类引用或指针,则可以修改为指向派生类的引用或指针(这种例外是新出现的)。这种特性被称为返回类型协变(covariance of return type),因为允许返回类型随类类型的变化而变化。

class Dwelling

{

public:

     // a base method

     virtual Dwelling &build(int n);

....

};

 

class Howel : public Dwelling

{

public:

// a derived method with a covariant return type

virtual Hovel & build(int n);  // same function signature

...

};

注意:这种例外只适用于返回值,而不适用于参数

第二,如果基类声明被重载了,则应在派生类中重新定义所有的基类版本。

如果只重新定义一个版本,则另外两个版本将被隐藏,派生类对象将无法使用它们。注意,如果不需要修改,则新定义可只调用基类版本。

 

 

《C++ Primer Plus(5rd)》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值