面试题答案
一键面试定义区别
- 重载(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)
函数构成了重载关系。