现在的位置: 首页 > 综合 > 正文

重新定义隐藏方法

2013年09月06日 ⁄ 综合 ⁄ 共 954字 ⁄ 字号 评论关闭

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

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)》

抱歉!评论已关闭.