#include <iostream.h>
class person
{
public:
virtual void name()
{
cout<<"A::name"<<endl;
}
private:
virtual void sex()
{
cout<<"A::sex"<<endl;
}
};
class student:public person
{
public:
virtual void name()
{
cout<<"B::name"<<endl;
}
virtual void address()
{
cout<<"B::address"<<endl;
}
private:
virtual void ID()
{
cout<<"B::ID"<<endl;
}
};
typedef void (*Fun)(void);//定義一個函數指針
void main()
{
student stu;
for(int i=0;i<4;i++)
{
Fun p = (Fun)*((int*) * (int*)(&stu)+i);
p();
}
}
運行結果:
說明:
首先在for循環內,使用函數指針獲得Student類對象stu的首地址,因爲stu的首地址保存了一個指針,這個指針指向了這個類的虛函數表,而這個虛函數表包含了父類person的虛函數表,當子類覆蓋了父類中的虛函數時(此例子中的virtual void name()),那麼std的虛函數表中原本指向父類的虛函數name()就改指向子類stu的name()了。
其中要注意的是,父類的虛函數表的函數順序是按照申明的順序並且父類的虛函數在子類的虛函數前面。因此對象stu的首地址指向的就是被自己覆蓋的name()函數了。
A類的虛函數表是這樣的:
A::name()
A::sex()
B類的虛函數表示這樣的:
B::name() ->原本是A::name()
A::sex()
B::address()
B::ID()