通過虛函數表訪問基類的私有虛函數

#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()

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章