//CMemory.cpp:Defines the entry point for the console application.//#include"stdafx.h"#include<IOSTREAM>using namespacestd;classBase { Public: Virtual voidF () {cout <<"Base::f"<<Endl;} Virtual voidG () {cout <<"base::g"<<Endl;} Virtual voidH () {cout <<"base::h"<<Endl;}};classDerive: Publicbase{ Public: Virtual voidF () {cout <<"Derive::f"<<Endl;}//virtual void g () {cout << "derive::g" << Endl;} Virtual voidH () {cout <<"derive::h"<<Endl;}};intMainintargcChar*argv[]) {typedefvoid(*pfunc) (void); Base b; cout<<"vptr Addr:"<< (int*) &b<<Endl; cout<<"First func addr:"<< (int*)(*(int*) &b+0) <<Endl; cout<<"second func addr:"<< (int*)(*(int*) &b) +1<<Endl; cout<<"third func addr:"<< (int*)(*(int*) &b) +2<<Endl; Pfunc FUNCF= (Pfunc) * ((int*)(*(int*) &b) +0); Pfunc FUNCG= (Pfunc) * ((int*)(*(int*) &b) +1); Pfunc Funch= (Pfunc) * ((int*)(*(int*) &b) +2); FUNCF (); FUNCG (); Funch (); Derive D; cout<<"vptr Addr:"<< (int*) &d<<Endl; cout<<"First func addr:"<< (int*)(*(int*) &d+0) <<Endl; cout<<"second func addr:"<< (int*)(*(int*) &d) +1<<Endl; cout<<"third func addr:"<< (int*)(*(int*) &d) +2<<Endl; Pfunc DFUNCF= (Pfunc) * ((int*)(*(int*) &d) +0); Pfunc DFUNCG= (Pfunc) * ((int*)(*(int*) &d) +1); Pfunc Dfunch= (Pfunc) * ((int*)(*(int*) &d) +2); DFUNCF (); DFUNCG (); Dfunch ();
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Multiple inheritance class has n virtual function table, inherits n variousint* * Pvtab = (int* *) &d;//two-dimensional array, first dimension: virtual function table, second dimension: virtual function tablePfunc dd = (Pfunc) pvtab[0][0]; DD (); return 0;}
Gets the virtual function address in the class