首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

如何得到一个虚函数的实际地址

2012-03-24 
怎么得到一个虚函数的实际地址菜了,晕了,问个问题structbase{virtualvoidfun1(){}virtualvoidfun2(){}virt

怎么得到一个虚函数的实际地址
菜了,晕了,问个问题

struct   base
{
        virtual   void   fun1(){}
        virtual   void   fun2(){}
        virtual   void   fun3(){}
};

struct   device   :   public   base
{
        virtual   void   fun1(){}
        virtual   void   fun2(){}
        virtual   void   fun3(){}
};

base*   CreateObj()
{
          return   new   device;
}
....

        base*   pp   =   CreateObj();

        pp-> fun3();  

        我想得到pp-> fun3();的函数地址(在这里是   device::fun3())

        当只知道base的定义,和   CreateObj   函数的时候

        然后得到这个真实的函数地址fun3()

        其实,可以通过查找虚函数表的第3个函数就可以了

        但当连第几个都不知道(只知道函数名)的时候如何做呢

       

....


分都散完了,就一点,喜欢大家帮忙

[解决办法]
void (*pf)()=&device::fun3;
pp-> *pf();
[解决办法]
uwinb没理解问的问题,关键在不知道它是base的还是device的.
[解决办法]
up
[解决办法]
来看看 Chiyer(星羽) 会问点什么问题 ...
[解决办法]
沙发没了,板凳没了,连地板都没了,只好up一下了- -
[解决办法]
这应该是mission impossible了...
连位置都定不了,也就是说函数声明顺序一变,表项的位置也一样变了...况且这个跟编译器还密切相关吧, 我没查C++标准,不知道对vtbl的顺序有啥要求没.
[解决办法]
pp-> fun3
难道这样不行么
[解决办法]
mark
[解决办法]
你为什么需要获得虚函数的实际地址?

[解决办法]
个人感觉你可以参考COM的实现机制,用QI来做。
[解决办法]
和编译器放置虚表指针位置有关,否则不可能,知道虚表位置就不用我再说了吧

星羽也来问问题啊:)
[解决办法]
派生类的虚表中虚函数地址的排列顺序和基类的虚表中虚函数地址排列顺序相同。
不了解基类。。。的~~

[解决办法]
COM 的 QI接口倒是可以参考一下 ...
[解决办法]
恩恩,不要死钻嘛~虫子出现喽星羽
[解决办法]
不会
帮你顶一下
[解决办法]
就算看了.h你都未必知道它在虚表上的位置。
因为根据C++的(未)规定,编译器自行决定虚表里的函数排列顺序。
完全可以有编译器根据函数类型进行排序构建虚表。
你可以知道某一个编译器下的情况,却无法推广到所有编译器。
试图确定函数在虚表中的位置是不合理的解。
应该根据原始需求找合理解。

热点排行