简述一下C++的重载和重写,以及他们的区别和实现方式

1. 重载(Overload)

定义

在同一作用域内(如类内部或全局作用域),定义多个同名函数,但它们的参数列表不同(参数类型、数量或顺序不同)。

重载是编译时多态的一种体现。

特点

函数名相同,参数列表不同。

返回类型可以不同,但仅返回类型不同不足以构成重载。

可以是成员函数,也可以是全局函数。

class Calculator {
public:
    int add(int a, int b) {         // 重载1:两个int参数
        return a + b;
    }
    double add(double a, double b) { // 重载2:两个double参数
        return a + b;
    }
    int add(int a, int b, int c) {   // 重载3:三个int参数
        return a + b + c;
    }
};

int main() {
    Calculator calc;
    calc.add(1, 2);     // 调用重载1
    calc.add(1.5, 2.5); // 调用重载2
    calc.add(1, 2, 3);  // 调用重载3
}

2. 重写(Override)

定义

在派生类中重新定义基类的虚函数,要求函数名、参数列表和返回类型完全相同。

重写是运行时多态的核心机制,通过虚函数(virtual)实现动态绑定。

特点

必须发生在继承关系中(基类与派生类)。

基类函数必须声明为 virtual。

派生类函数使用 override 关键字(C++11 起)明确表示重写。

class Animal {
public:
    virtual void speak() { // 基类虚函数
        std::cout << "Animal sound" << std::endl;
    }
};

class Dog : public Animal {
public:
    void speak() override { // 重写基类虚函数
        std::cout << "Dog barks" << std::endl;
    }
};

int main() {
    Animal* animal = new Dog();
    animal->speak(); // 输出: Dog barks(动态绑定)
    delete animal;
}

特性

重载(Overload)

重写(Override)

作用域

同一类或同一作用域

基类与派生类之间

函数签名

参数列表必须不同

函数名、参数列表、返回类型必须完全相同

多态性

编译时多态(静态绑定)

运行时多态(动态绑定)

继承关系

不需要

必须存在继承关系

虚函数

不需要

基类函数必须为 virtual

关键字

override(C++11 起)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值