先来看看下面这段代码:
#include <iostream>
using namespace std;
class A{
public:
virtual void print(){
cout << "A::print()\n";
}
};
class B : public A{
public:
void print(int i = 0){
cout << "B::print()\n";
}
};
int main(){
A *ptr = nullptr;
B b;
ptr = &b;
ptr->print();
b.print();
b.print(1);
b.A::print();
return 0;
}
它的输出结果是:
我们发现当用基类的指针ptr去调用虚函数print()时,并没有和预想的一样动态绑定到派生类的print()函数。那么这是为什么呢?
事实上,虚函数要求的是基类与派生类完全相同的两个函数,在上面这个例子中,编译器把print()与print(int i = 0)看作两个不相关的函数,也自然不会有所谓“多态性”了。
补充一句,就算你想在派生类的print(int i = 0)后加上override也是不可行的: