打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
单继承下虚函数表中虚函数的排列顺序
 C++ Code 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100


#pragma  once

#include <iostream>
#include <stdio.h>

namespace n2013_0724_2324
{
    class Base1 
    {
    public:
        virtual void vfoo1() {
            std::cout << "In virtual void Base1::vfoo1()" << std::endl;
        }
        virtual void vfoo2(){ 
            std::cout << "In vvirtual oid Base1::vfoo2()" << std::endl;
        }
    };
    class Derived : public Base1 
    {
    public:
        virtual void vfoo1() {
            std::cout << "In virtual void Derived::vfoo1()" << std::endl;
        }
        virtual void vfoo3(){
            std::cout << "In vvirtual oid Derived::vfoo3()" << std::endl;
        }
    };

    // 定义类成员函数指针
    typedef void (Base1::*PBaseFun)();
    typedef void (Derived::*PDerivedFun)(); 

    typedef void (*PVoidFun)(Base1*);


    /*
     * @Func : 观察虚函数在虚表中的排列。包括:(1)
     *
     * @测试方法:找到虚函数表中函数的地址,调用之,观察输出结果,从而得知对应的函数是什么
     *
     * @测试结果及分析
                 Base1 *pb = new Base1...
                 Base1虚表中第0个索引的函数为:  In virtual void Base1::vfoo1()
                 Base1虚表中第1个索引的函数为:  In vvirtual oid Base1::vfoo2()

                 Base1 *pb = new Derived...
                 Derived虚表中第0个索引的函数为:        In virtual void Derived::vfoo1()
                 Derived虚表中第1个索引的函数为:        In vvirtual oid Base1::vfoo2()
                 Derived虚表中第2个索引的函数为:        In vvirtual oid Derived::vfoo3()
     * 从输出结果可以看出,Base1类的虚函数表含有2个虚函数,按声明顺序排列;Derived类的虚函数
     * 表含有2个虚函数,按声明顺序排列
     *
     * @说明:在单继承结构中,只有一个虚函数表,表中的函数根据声明的顺序排列
     */

    void test(){

        #define TEST1

#ifdef TEST1

        Base1 *pb;
        int *pInt;

        // 观察Base1的虚表中虚函数的排列位置
        std::cout << "Base1 *pb = new Base1..." << std::endl;
        pb = new Base1();
        pInt = (int*)(*((int*)pb)); // 首先以int*的形式解析pb地址的值;然后将该值解析为int*
        // 调用解析处理出来函数
        std::cout << "Base1虚表中第0个索引的函数为:\t";
        PVoidFun pvf = (PVoidFun)(pInt[0]);
        pvf(pb);
        std::cout << "Base1虚表中第1个索引的函数为:\t";
        pvf = (PVoidFun)(pInt[1]);
        pvf(pb);


        std::cout << "\n";

        // 观察Derived的虚表中虚函数的排列位置
        std::cout << "Base1 *pb = new Derived..." << std::endl;
        pb = new Derived;
        pInt = (int*)(*((int*)pb)); // 首先以int*的形式解析pb地址的值;然后将该值解析为int*

        std::cout << "Derived虚表中第0个索引的函数为:\t";
        pvf = (PVoidFun)(pInt[0]);
        pvf(pb);
        std::cout << "Derived虚表中第1个索引的函数为:\t";
        pvf = (PVoidFun)(pInt[1]);
        pvf(pb);
        std::cout << "Derived虚表中第2个索引的函数为:\t";
        pvf = (PVoidFun)(pInt[2]);
        pvf(pb);

#endif // TEST1


    }
}
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
虚析构函数的使用(转载!)
C++中成员函数的重载、覆盖与隐藏
C++@子类类型转换为父类类型
Cplusplus默认构造函数——深入理解
C++类成员的初始化
如何使用C++共享指针std::shared_ptr?
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服