如下面的程序:
#include < iostream >
using namespace std;class base{
public:
virtual void f(char i){
cout << "Base class: " << i << endl;
};
virtual void f(double d){
cout << "Base class: " << d << endl;
}
};
class derived : public base{
public:
void f(char i){
cout << "Derived class: " << i << endl;
}
};
int main(int argc, char** argv)
{
base *pb = new derived;
pb->f(2.0);
delete pb;
return 0;
}
开始的时候感觉有点迷惑,被调用的是 base 的 f 呢?还是 derived 的 f(需要进行参数类型转换)。实验证明,被调用的是 base 的 f。
因为重载是根据静态类型来选择函数的,亦即由 pb 本身的类型来决定。而虚拟则是根据动态类型来选择函数,由 pb 指向的对象类型决定。因此编译器首先根据重载来选择一个基类的函数,如果该函数为虚拟函数且被派生类实现,则再通过多态机制调用派生类函数。
文章来源:
http://my.donews.com/robinchow/2007/01/11/ocipmucddsvoutkpnwjgeqrlwadgilgxnoma/