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



例如,我有:

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

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

A* ptr= new B();

我只有一个指针"ptr"。我知道指针是类型"A*",但我不知道它是否指向类"A"或"B"的对象,还是指向从类 A 派生的其他类"X",并且还实现了函数"run"(在我的示例中,我的对象是类型"B"(。如何获取在对象类中实现的函数"run"的地址?

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

据我了解,没有便携式方法可以做到这一点。 选项:

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

并就地使用它的地址而不是实际运行函数的地址?

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

最新更新