2017-08-15 42 views
-1

比如我有:如何获取虚拟方法的地址,如果我有指向基类对象的指针?

class A{ 
public: 
virtual void run(){...} 
}; 


class B:public A { 
public: void run(){...} 
}; 


A* ptr= new B(); 

我只有一个指针“ptr'.I知道,指针的类型是‘A *’,但我不知道它是否指向类的反对” A '或'B'或其他一些从类A派生出来的类'X',并且还实现了函数'run'(在我的例子中,我的对象是类型'B')。我怎样才能得到函数'run'那是在我的对象的类中实现的?

+5

为什么你需要知道它? – litelite

+0

“run”函数的地址(实际上将被使用)只能在虚拟表中找到,这通常对程序员不可见。你究竟做了什么:你真的需要函数的地址,还是只是寻求确认运行时调度到正确的派生函数? – Xirema

+0

你想要一个函数指针还是地址? – alain

回答

1

听起来像是你想dynamic_cast。 你可以dynamic_cast到各种派生类的类型和测试,如果你得到一个有效的指针或nullptr回来。这将让你确定你的基类指针指向的对象的动态类型。

+0

是的,但我没有得到函数的地址,我不知道所有类型的名称。 – nikojov

0

据我所知,没有可移植的方式。 选项:

  1. 手动查找vtbl。它不是便携式的。
  2. 如果你可以改变的基类,试图迫使其用户,为您提供
  3. 你会写的排序
void f(A *object) { 
    object->run(); 
} 

的包装而在地方使用它的地址,而不是一个地址的必要信息的实际运行功能?

顺便说一句,你在找什么?一个指向成员函数的指针?一个指向实现的指针?只是一些地址?