Hovel trump:
也可能不会出现警告。但不管结果怎样,代码将具有如下含义:
Hovel trump:
trump. showperks ():
trump.showperks (5) :
新定义将 showperks()定义为一个不接受任何参数的函数。重新定义不会生成函数的两个重载版本,
而是隐藏了接受·个int 参数的基类版本。简而言之,重新定义继承的方法并不是重载。如果在派生类中
重新定义函数,将不是使用相同的函数特征标覆盖基类声明,而是隐藏同名的基类方法,不管参数特征标
如何。
这引出了两条经验规则:第一,如果重新定义继承的方法,应确保与原来的原型完全相同,但如果返
回类型是基类引用或指针,则可以修改为指向派生类的引用或指针(这种例外是新出现的)。这种特性被称
为返回类型协变(covariance of return type),因为允许返回类型随类类型的变化而变化:
class Dwelling
public:
// a base method
virtual Dwelling & build(int n);
// valid
// invalid
class Hovel : public Dwelling
public:
// a derived method with a covariant return type
virtual Hovel & build (int n); // same function signature
-
注意,这种例外只适用于返回值,而不适用于参数。
第,如果基类声明被重载了,则应在派生类中重新定义所有的基类版本。
class Dwelling
public:
// three overloaded showperks ()
virtual void showperks (int a) const:
virtual void showperks (double x) const:
virtual void showperks ()const:
class Hovel: public Dwelling
public:
// three redefined showperks ()
virtual void showperks (int a) const:
virtual void showperks (double x) const:
virtual void showperks()const:
13.5
1:
如果只重新定义一个版本,则另外两个版本将被隐藏,派生类对象将无法使用它们。注意,如果不需
要修改,则新定义可只调用基类版本。
访问控制:protected
到目前为止,本书的类范例已经使用了关键字public和private来控制对类成员的访问。还存在另一个
访问类别,这种类别用关键字 protected表示。关键字protected与private 相似,在类外只能用公有类成员
来访问protected部分中的类成员。private和 protected之间的区别只有在基类派生的类中才会表现出来。派