MST

星途 面试题库

面试题:C++ 类中成员函数的重载与覆盖有何区别

请详细阐述C++类中成员函数重载(Overloading)和覆盖(Overriding)在定义、参数、发生范围等方面的区别,并举例说明。
39.2万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

定义区别

  • 重载(Overloading):在同一个类中,存在多个同名函数,但函数的参数列表不同(参数个数、类型或顺序不同),与返回值类型无关。
  • 覆盖(Overriding):发生在派生类中,派生类中的函数与基类中虚函数具有相同的函数名、参数列表和返回值类型(协变返回类型除外)。

参数区别

  • 重载:参数列表必须不同。例如,参数个数可以不同,如void func(int);void func(int, int);;参数类型可以不同,如void func(int);void func(double);;参数顺序不同,如void func(int, double);void func(double, int);
  • 覆盖:参数列表必须与基类中被覆盖的虚函数完全相同。

发生范围区别

  • 重载:只发生在同一个类中。
  • 覆盖:发生在具有继承关系的基类和派生类之间。

举例说明

#include <iostream>

// 基类
class Base {
public:
    // 虚函数,用于覆盖
    virtual void display() {
        std::cout << "Base::display()" << std::endl;
    }

    // 用于重载的函数
    void print(int num) {
        std::cout << "Base::print(int): " << num << std::endl;
    }
};

// 派生类
class Derived : public Base {
public:
    // 覆盖基类的display函数
    void display() override {
        std::cout << "Derived::display()" << std::endl;
    }

    // 在派生类中重载print函数
    void print(double num) {
        std::cout << "Derived::print(double): " << num << std::endl;
    }
};

int main() {
    Base* basePtr = new Derived();
    basePtr->display(); // 调用Derived::display(),体现覆盖

    Base baseObj;
    baseObj.print(10); // 调用Base::print(int)

    Derived derivedObj;
    derivedObj.print(3.14); // 调用Derived::print(double),体现重载

    delete basePtr;
    return 0;
}

在上述代码中,Base类中的display函数是虚函数,Derived类中的display函数覆盖了Base类的display函数;Base类中的print(int)Derived类中的print(double)函数构成了重载关系。