c++ 通过指针调用虚函数,无论是否查询VM表

n3schb8v  于 2023-04-01  发布在  其他
关注(0)|答案(1)|浏览(80)

我想获取一个c++类的成员函数的地址,将其存储在一个指针中,并在以后调用虚函数。
我知道一些关于它的事情,但现在不知道如何获取虚拟函数的某个实现的地址,该虚拟函数不是最后代类(对象的实际类)的实现。
下面是一些示例代码:

#include <iostream>

    using namespace std;

    class ca
    {
            public:
            virtual void vfunc() {cout << "a::vfunc ";}
            void mfunc() {cout << "a::mfunc ";}
    };

    class cb : public ca
    {
            public:
            virtual void vfunc() {cout << "b::vfunc ";}
    };

    extern "C" int main(int, char **)
    {
            void (ca:: *ptr_to_vfunc)() = &ca::vfunc;

            cout << sizeof(ptr_to_vfunc) << " ";

            cb b;

            (b.*ptr_to_vfunc)();

            ca a;

            (a.*ptr_to_vfunc)();

            void (ca:: *ptr_to_mfunc)() = &ca::mfunc;

            cout << sizeof(ptr_to_mfunc) << " ";
            (a.*ptr_to_mfunc)();
    }

输出为:
12 B::自愿基金a::自愿基金12 a::多国基金
我使用的是win32环境,成员函数指针的大小是3 * 32位值!当我获取成员函数的地址时,我没有指定一个对象,但是,我的调用调用了vfunc()的最后代类的实现。
1)这里发生了什么?为什么是12字节而不是4字节?2)我如何获取ca::vfunc()的地址并在b上调用它,就像我通常对b.ca::vfunc()所做的那样。

blmhpbnm

blmhpbnm1#

好的:它正在做它应该做的事情。
但我想回答你的问题
1)这是怎么回事?为什么是12字节而不是4字节?
为什么不呢?
该标准未规定尺寸。
我不知道为什么你期望一个正常的指针是4。

如果问题是“为什么方法指针比普通指针大?”

因为实现需要额外的空间来保存有关调用的信息。
2)我如何获取ca::vfunc()的地址并在B上调用它,就像我通常对b.ca::vfunc()所做的那样。
你不能。

相关问题