3虚函数表分析

来源:互联网 发布:伦敦大学学院专业 知乎 编辑:程序博客网 时间:2024/06/05 21:03


1.带有虚函数的类会多出四个字节的大小,这是一个指针的大小,这个指针的用途是指向虚函数表。

2.继承是虚函数表的顺序

#include<iostream>

usingnamespacestd;

 

classH

{

   virtualvoidM()

   {

       cout <<"H::H" <<endl;

   }

};

 

classA

{

   //int num

   virtualvoidg()

   {

       cout <<"A::g" <<endl;

   }

private:

   virtualvoidf()

   {

       cout <<"A::f" <<endl;

   }

   virtualvoidj()

   {

       cout <<"A::j" <<endl;

   }

};

 

//函数中有虚函数的情况下,这时候多出来了一个指针用于指向虚函数表

classB :publicA//,public H

{

   voidg()

   {

       cout <<"B::g" <<endl;

   }

   virtualvoido()

   {

       cout <<"B::o" <<endl;

   }

   virtualvoidh()

   {

       cout <<"B::h" <<endl;

   }

};

 

typedefvoid(*Fun)(void);

 

voidmain()

{

   cout <<sizeof(A) << endl;

   cout <<sizeof(H) << endl;

   cout <<sizeof(B) << endl;

 

   Bb;

   FunpFun;  //定义一个函数指针

   for (inti = 0;i < 5;i++)

   {

       pFun = (Fun)*((int *)*(int *)(&b) + i);

       pFun();

   }

 

   cin.get();

}

运行结果:

3.分析

pFun = (Fun)*((int *)*(int *)(&b) + i);

A:分析*(int *)(&b),这里取的是b对象地址中的内容

B:(int **int *)(&b)表示的是虚函数表的首地址

4.分析*int *)(&b

#include<iostream>

 

usingnamespacestd;

 

voidmain()

{

   inta = 10;

   cout << &a << endl;

   cout << *(int *)(&a) <<endl;

   

   cin.get();

}

运行结果:

 

 

 

 

 

0 0
原创粉丝点击