c++ 重载、重写、覆盖

本文解释了C++中的重载(overload)、重写(overwrite,即子类覆盖父类同名函数)和覆盖(override,指虚拟函数的子类实现)的区别,通过Animal和Rabbit类实例展示这些概念的实际应用。
摘要由CSDN通过智能技术生成
  • 重载:指在同一作用域内,有多个同名但参数不同的函数的现象,叫重载;可以是任何用户定义的函数,例如 类成员函数、类静态函数、普通函数
  • 重写:子类重写父类的同名函数,只要子类出现有父类的同名函数,父类中所有该名称的函数都被重写,子类中无法再访问父类中定义该名称的函数,不管子类函数的参数类型是什么。除了覆盖的情况。
  • 覆盖:指子类实现了父类中的同名virtual函数,且函数参数与返回值完全一致。
/**
 * 重载(overload)、重写(overwrite)、覆盖(override)的区别
 * 
 * 重载:指在同一作用域内,有多个同名但参数不同的函数的现象,叫重载
 * 覆盖:是子类实现了一个与父类中同名同参数且virtual的函数
 * 
 * 重写:子类实现了一个与父类中同名的函数,不管参数与返回值是否一致(如果父类中的同名函数是虚函数,且子类中的函数参数与返回值完全一致,则是覆盖)
*/

#include <iostream>
#include <string>
using namespace std;

class Animal
{

public:
    void run()
    {
        cout << "Animal run " << endl;
    }

    void run(int speed) // overload
    {
        cout << "Animal run " << speed << "m/s" << endl;
    }

    virtual void eat(string food)   // virtual function
    {
        cout << "Animal eat " << food << endl;
    }
};

class Rabbit : public Animal
{
public:
    void run(int speed) // overwrite,所有run函数都被重写
    {
        cout << "Rabbit run " << speed << "m/s" << endl;
    }

    void eat(string food) override // override
    {
        cout << "Rabbit eat " << food << endl;
    }

    void eat() // overload
    {
        cout << "Rabbit eat nothing" << endl;
    }
};

int main()
{
    Animal *animal = new Rabbit;

    animal->run();
    animal->run(100);
    animal->eat("apple");
    // animal->eat();   // 报错,Animal无eat()定义

    Rabbit *rabbit = (Rabbit *)animal;
    // rabbit->run();   // 会报错,如果注释掉 Rabbit::run(int speed) 则可以运行;所有同名函数都被重写
    rabbit->run(100);
    rabbit->eat("apple");
    rabbit->eat();

    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值