总结
- ride 重写基类虚函数,是运行时多态
- load 编译时编译器根据参数类型选择对应函数,是编译时多态
override
用于显式的指定一个函数重写了基类中的虚函数。
这样做的好处是可以在编译期间检查派生类是否真正覆盖了基类中的虚函数,从而避免在运行时出现意外的错误
class Base {
public:
virtual void foo() { //如果想要在派生类中override基类中的同名虚函数,需要在基类中将该函数声明为虚函数
cout << "Base::foo()" << endl;
}
};
class Derived : public Base {
public:
void foo() override { // 使用 override 关键字
cout << "Derived::foo()" << endl;
}
};
int main() {
Derived d;
Base* p = &d;
p->foo(); // 调用 Derived::foo()
return 0;
}
当通过基类的指针或引用调用虚函数时,会根据指针或引用实际指向的对象的类型来选择调用哪个版本的虚函数。这种根据对象类型来选择调用哪个版本的虚函数的机制被称为动态绑定(dynamic binding)或者后期绑定(late binding)
使用规则:
1. 重写⽅法的参数列表,返回值,所抛出的异常与被重写⽅法⼀致
2. 被重写的⽅法不能为private
3. 静态⽅法不能被重写为⾮静态的⽅法
4. 重写⽅法的访问修饰符⼀定要⼤于被重写⽅法的访问修饰符 (public>protected>default>private)
overload
在同一作用域中定义了多个同名函数,但是这些函数的参数类型、个数、顺序等不同。这样做的好处是可以根据不同的参数类型、个数、顺序等来选择调用哪个函数
void foo(int x) {
cout << "foo(int): " << x << endl;
}
void foo(double x) {
cout << "foo(double): " << x << endl;
}
int main() {
foo(10); // 调用 foo(int)
foo(3.14); // 调用 foo(double)
return 0;
}