【问题标题】:How can i get address of virtual method , if I have pointer to base class object?如果我有指向基类对象的指针,如何获取虚拟方法的地址?
【发布时间】:2017-08-15 19:53:32
【问题描述】:

例如我有:

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


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


A* ptr= new B();

我只有一个指针'ptr'。我知道指针是'A*'类型,但我不知道它是指向'A'或'B'类的对象还是其他'X'类的对象' 它派生自 A 类并且还实现了函数 'run'(在我的示例中,我的对象是类型 'B')。我怎样才能获得在我的对象的类中实现的函数 'run' 的地址?

【问题讨论】:

  • 你为什么需要知道它?
  • run 函数的(实际使用的)地址只能在虚拟表中找到,通常程序员看不到。您究竟想通过这样做来完成什么:您真的需要函数的地址,还是只是在寻找对正确派生函数的运行时分派的确认?
  • 你想要函数指针还是地址?
  • 我在找地址。或者问是否真的可以做。
  • @nikjov 您直接尝试做的事情无法完成。根据您的情况,可以完成类似的、切题的事情,但是您需要解释这种代码的用例,因为没有它,就不可能给您有用的答案.

标签: c++ function polymorphism virtual


【解决方案1】:

听起来你想要dynamic_cast。 您可以dynamic_cast 到各种派生类类型,并测试您是否获得有效指针或nullptr 返回。这将让您确定基类指针指向的对象的动态类型。

【讨论】:

  • 是的,但我没有得到函数的地址,也不知道所有类型的名称。
【解决方案2】:

据我了解,没有可移植的方法。 选项:

  1. 手动查找 vtbl。它不便携。
  2. 如果您可以更改基类,请尝试强制其用户向您提供必要的信息
  3. 你能写一个排序的包装器吗
void f(A *object) {
   object->run();
}

并使用它的地址代替实际运行函数的地址?

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-13
    相关资源
    最近更新 更多