虚函数访问知识点《王道程序员求职宝典》p163
1)与普通函数一样,虚函数可通过对象名来调用,此时编译器采用静态联编。通过对象名访问虚函数时,调用哪个类的函数取决于定义对象名的类型。对象是基类就调基类,对象是子类就调相应的子类。
2)使用指针访问非虚函数时,编译器会根据指针本身的类型决定调用哪个函数,而不是根据指针指向的对象类型。与指针类型有关
3)使用指针访问虚函数时,编译器根据指针所指对象的类型决定调用函数(动态联编),与指针本身类型无关。
#(2012 微软)
#include <iostream>
using namespace std;
class Base{
public:
char Value(){
return 'A';
}
virtual char VirtualValue(){
return 'X';
}
};
class Derived: public Base{
public:
char Value(){
return 'U';
}
};
class VirtualDerived: virtual public Base{
public:
char Value(){
return 'Z';
}
char VirtualValue(){
return 'V';
}
};
int main(){
Base *p1 = new Derived();
Base *p2 = new VirtualDerived();
cout<<p1->Value()<<"-"<<p1->VirtualValue()<<"-"<<p2->Value()<<"-"<<p2->VirtualValue()<<endl;
return 0;
}
#运行结果:
A-X-A-V
VirtualValue()为虚函数,而Value()为非虚函数。