本文系学习21天学能C++中的一些记录
派生类可以覆盖基类函数,这意味着在派生类中修改其实现。在派生类中创建一个返回值和特征标与基类成员函数相同但实现不同的函数时,被称为覆盖该函数。
覆盖函数时,特征标必须与基类中被覆盖的函数相同,特征标指的是函数原型中除返回类型外的内容,即函数名,参数列表和可能用到的关键字const。
注意、重载和覆盖,这两个术语类似,功能也差不多,重载方法时,创建多个名称相同但特征标不同的方法;覆盖方法时,在派生类中创建一个名称和特征标都与基类方法相同的方法(方法意为可以操作成员数据的成员函数)。
覆盖可以会产生一些意想不到的问题,若基类重载了多个函数,一个不接受参数,一个接受一个char参数,一个接受一个int和char参数,但派生类只覆盖了不接受参数的函数,这样的话我们就不能通过派生类的对象访问基类的另外两个接受参数的同名函数,若要求能访问这两个函数的话必须将这两个函数一并覆盖才行。
规则是:覆盖任一个重载方法后,该方法的其它所有版本都将被隐藏,如果不希望它们被隐藏,必须对其进行覆盖。
覆盖基类方法后,仍可以通过限定方法名来调用它-----在方法名前加上基类名和域名符: baseClass :: Method() 如:Fido.Mammal::Move (10); 这是显示地调用Mammal的方法。
提示:通过使用::来调用祖先的类方法时,如果在继承层次结构中,在祖先和后代之间插入了新类,后代将跳过这些中间类,从而遗漏对中间类实现的重要功能的调用。
应该:
应通过派生类来扩展经过测试的类的功能;
通过覆盖基类方法来改变派生类中某些函数的行为;
不应该:
不要通过修改函数特征标来隐藏基类函数;
不要忘记const是特征标的组成部分;
别忘记返回类型不是特征标的组成部分;