怎么得到一个虚函数的实际地址
菜了,晕了,问个问题
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++的(未)规定,编译器自行决定虚表里的函数排列顺序。
完全可以有编译器根据函数类型进行排序构建虚表。
你可以知道某一个编译器下的情况,却无法推广到所有编译器。
试图确定函数在虚表中的位置是不合理的解。
应该根据原始需求找合理解。