有虚函数的类内部有一个称为“虚表”的指针(有多少个虚函数就有多少个指针),这个就是用来指向这个类虚函数。也就是用它来确定调用该那个函数。
例如:#include <iostream>
using namespace std;
class A{
public:
virtual void fun1(){
cout << "In class A::fun1()!" << endl;
}
virtual void fun2(){
cout << "In class A::fun2()!" << endl;
}
void fun3(){
cout << "In class A::fun3()!" << endl;
}
~A(){
cout << "A destroy!" << endl;
}
};
class B : public A{
public:
void fun2(){
cout << "In class B::fun2()!" << endl;
}
void fun3(){
cout << "In class B::fun3()!" << endl;
}
~B(){
cout << "B destroy!" << endl;
}
};
int main(){
A a;
B b;
a.fun1();
a.fun2();
a.fun3();
cout << endl;
A *a1 = new A;
a1 = &b;
a1->fun1();
a1->fun2();
a1->fun3();
cout << endl;
b.fun1();
b.fun2();
b.fun3();
cout << endl;
return 0;
}
实际上在编译的时候,编译器会自动加入“虚表”。虚表的使用方法是这样的:如果派生类在自己的定义中没有修改基类的虚函数,就指向基类的虚函数;如果派生类改写了基类的虚函数(就是自己重新定义),这时虚表则将原来指向基类的虚函数的地址替换为指向自身虚函数的指针。这时若像下面这样:
