覆盖方法(overriding)
什么是类函数的覆盖方法:
覆盖方法用于同一函数的重写即派生类函数覆盖基类同名函数
覆盖方法重写(覆盖)了一个方法,以实现不同的功能.一般是用于子类在继承父类时,重写(重新实现)父类中的方法
覆盖方法的特征:
范围不同(分别位于 基类 和 派生类中)
函数名字相同
函数参数相同
基类函数必须有virtual(虚函数)关键字
为什么需要覆盖方法:
在 C++ 里,当我们需要在 基类里提供一个通用的函数,但是在它的某个子类里,需要修改这个方法(通用函数)的实现,就要用到覆盖方法
当父类中的某些方法不能满足要求时,子类中改写父类的方法
注意:
1.重写方法的 参数列表(方法名称,参数列表,返回类型)必须完全与被重写的方法相同否则不能称其为覆盖而是 重载
2.重写方法的 访问修饰符一定要大于被重写方法的访问修饰符(public>protected>default>private
)
3.重写的方法的返回值必须和被重写的方法的返回一致
3.被重写的方法不能为private,否则在其子类中只是新定义了一个方法,并没有对其进行重写
5.静态方法不能被重写为非静态的方法(会编译出错)
覆盖方法例程
#include <iostream>
#include <string>
using namespace std;
//todo覆盖方法
class Animal
{
public:
Animal(string name);
void eat();//基类中的eat()方法 因为monkey和turtle都具有eat的功能 所有选择此方法为被覆盖重写的通用方法
void sleep();
void run();
protected:
string thename;
};
class Monkey :public Animal//todo建立一个继承自Animal基类的子类Monkey
{
public:
Monkey(string name);
void climb();
void eat();//todo再一次声明基类中的通用函数eat()
//注意: 重写方法的参数列表必须完全与被重写的方法相同 否则不能称其为 覆盖 而是 重载
// 重写方法的访问修饰符一定要大于被重写方法的访问修饰符(public>protected>default>private)
// 重写的方法的返回值必须和被重写的方法的返回一致
// 被重写的方法不能为private,否则在其子类中只是新定义了一个方法,并没有对其进行重写
// 静态方法不能被重写为非静态的方法(会编译出错)
};
class Turtle :public Animal
{
public:
Turtle(string name