#include <iostream>
using namespace std ;
class Father
{
private :
virtual void Say() //只有添加了virtual 關鍵字聲明才會產生虛函數表 虛函數表在編譯的時候確定 virtual是實現多態的關鍵
{
cout<<"Father::Say()"<<endl ;
}
virtual void Run()
{
cout<<"Father:Run()"<<endl;
}
};
class Son :public Father
{
public:
virtual void Run() //派生類虛函數地址 替換父類函數地址在虛函數表中的位置 如需繼續被集成那麼 仍然要加上virtual
{
cout<<"Son:Run()"<<endl;
}
virtual void MakeLove() //派生類也需要有virtual才有虛函數表函數 派生類只有聲明了virtual才會把函數加入虛函數表
{
cout<<"Son::MakeLove();"<<endl;
}
};
class SmallSon:public Son
{
public:
virtual void Run() //
{
cout<<"SmallSon:Run()"<<endl;
}
};
typedef void(*Func)() ; //定義一個函數類型定義
void main()
{
Father fa;
Func func=NULL ;
cout<<"Virtual Table Address:"<<&fa<<endl ;
func=(Func)*((int*)*(int*)(&fa));//把對象首地址轉換為int*防止翻轉為對象 然後取出virtual table地址 然後在取出第一個虛函數的存放地址轉換為int*
//對象首地址存放虛函數表的地址 ,然後轉換為int* 取出 虛函數表第一個函數 順序是虛函數聲明順序
//完全拜托了C++權限控制 這也是C++的缺陷
func();
func=(Func)*((int*)*(int*)(&fa)+1);
func();
Son son ;
func=(Func)*((int*)*(int*)(&son));
func();
func=(Func)*((int*)*(int*)(&son)+1);
func();
func=(Func)*((int*)*(int*)(&son)+2);
func();
SmallSon sson ;
((Func)*((int*)*(int*)&sson))();
((Func)*((int*)*(int*)&sson+1))();
//多層繼承 一個表 多重繼承多個表 表地址在 對象首地址開始存放
}