通过基类引用或指针调用基类中定义的函数时,我们并不知道执行函数的对象的确切类型,执行函数的对象可能是基类类型的,也可能是派生类型的。如果调用非虚函数,则无论实际对象是什么类型,都执行基类类型所定义的函数。如果调用虚函数,则直到运行时才能确定调哪个函数,运行的虚函数是引用所绑定的或指针所指向的对象所属类型定义的版本。
只有通过引用或指针调用,虚函数才在运行时确定。只有在这些情况下,直到运行时才知道对象的动态类型。
#include <iostream>
using namespace std;
class Base{
public:
Base(){a=2;b=5;};
virtual int get_a()
{
return a;
}
int a,b;
};
class M:public Base{
public:
M(){};
int get_a(){
return a+b;
}
};
int main()
{
M a;
Base *base;
base=&a;
cout<<base->get_a()<<endl;
/************************************************************************/
/* 将调用M类中的get_a()函数
/*如果要覆盖虚函数机制改成cout<<base->Base::get_a()<<endl;
/************************************************************************/
return 0;
}