2023——visual studio2022 &Linux C++获取虚指针手动调用虚函数

C++获取虚指针手动调用虚函数_c++虚方法 用指针调用_mq白的博客-CSDN博客vs2022下成功运行,你可能会觉得很怪异,居然要用三级指针,我甚至去测了一下,vs2017是一级,vs2019是二级,好了,大家知道个这么事情就好。https://blog.csdn.net/a4364634611/article/details/127853985?spm=1001.2101.3001.6650.3&utm_medium=distribute.pc_relevant.none-task-blog-2~default~BlogCommendFromBaidu~Rate-3-127853985-blog-98484061.235%5Ev36%5Epc_relevant_default_base3&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2~default~BlogCommendFromBaidu~Rate-3-127853985-blog-98484061.235%5Ev36%5Epc_relevant_default_base3&utm_relevant_index=4

我之前一直困惑,为啥所有代码都不能运行,现在我知道了,原来是编译器各自的实现不一样。

下面的代码主要是参考上面链接的代码写的,在vs2022和Linux上都可以运行,Linux似乎也可以运行另一种虚函数表的代码,不过因为我主要用的是vs,就不研究了。

另外关于虚函数的指针类型,用啥都行int long void ,编译器不输出结果和和这个是没有关系的。

#include <iostream>
using namespace std;

class Base
{
public:
    virtual void f() { cout << "Base::f" << endl; }

    virtual void g() { cout << "Base::g" << endl; }

    virtual void h() { cout << "Base::h" << endl; }
};

typedef void (*Fun)(void);

int main()
{
    Base b;
    //Fun pFun = NULL;
    cout << "b      的地址: " << &b << endl;
    //这里指针用啥都行int ,long,void也行
    void ***vptr = (void ***) (&b);
    void (*p)() = (void (*)())(vptr[0][0]);
    void (*p2)() = (void (*)())(vptr[0][1]);
    void (*p3)() = (void (*)())(vptr[0][2]);
    //这个无意义,无法运行
    //void (*p4)() = (void (*)())(vptr[0][3]);
    //p4();
    Fun f1 = (Fun) vptr[0][0];
    Fun f2 = (Fun) vptr[0][1];
    Fun f3 = (Fun) vptr[0][2];
    f1();
    f2();
    f3();
    p();
    p2();
    p3();
    cout << "vptr   的地址: " << vptr << endl;
    //vptr[1]没啥意义
    cout << "vptr[0]的地址: " << &vptr[0] << endl;
    cout << "vptr[1]的地址: " << *&vptr[1] << endl;
    cout << "vptr[0]的指向: " << vptr[0] << endl;
    cout << "vptr[0]的指向: " << *&vptr[0] << endl;
    cout << "vptr[1]的指向: " << vptr[1] << endl;

    cout << "vptr[0][0]的地址: " << &vptr[0][0] << endl;
    cout << "vptr[0][1]的地址: " << &vptr[0][1] << endl;
    cout << "vptr[0][2]的地址: " << &vptr[0][2] << endl;
    //这俩无意义
    cout << "vptr[0][3]的地址: " << &vptr[0][3] << endl;
    cout << "vptr[0][4]的地址: " << &vptr[0][4] << endl;
    cout << "vptr[0][0]的指向: " << vptr[0][0] << endl;
    cout << "vptr[0][1]的指向: " << vptr[0][1] << endl;
    cout << "vptr[0][2]的指向: " << vptr[0][2] << endl;
    //这俩无意义
    cout << "vptr[0][3]的指向: " << vptr[0][3] << endl;
    cout << "vptr[0][4]的指向: " << vptr[0][4] << endl;

    //pFun();
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值