欢迎访问 生活随笔!

生活随笔

当前位置: 首页 >

3虚函数表分析

发布时间:2024/9/27 38 豆豆
生活随笔 收集整理的这篇文章主要介绍了 3虚函数表分析 小编觉得挺不错的,现在分享给大家,帮大家做个参考.


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

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

#include <iostream>

using namespace std;

 

class H

{

    virtual void M()

    {

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

    }

};

 

class A

{

    //int num

    virtual void g()

    {

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

    }

private:

    virtual void f()

    {

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

    }

    virtual void j()

    {

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

    }

};

 

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

class B :public A //,public H

{

    void g()

    {

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

    }

    virtual void o()

    {

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

    }

    virtual void h()

    {

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

    }

};

 

typedef void(*Fun)(void);

 

void main()

{

    cout << sizeof(A) << endl;

    cout << sizeof(H) << endl;

    cout << sizeof(B) << endl;

 

    B b;

    Fun pFun;   //定义一个函数指针

    for (int i = 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>

 

using namespace std;

 

void main()

{

    int a = 10;

    cout << &a << endl;

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

   

    cin.get();

}

运行结果:

 

 

 

 

 

总结

以上是生活随笔为你收集整理的3虚函数表分析的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。