C++ 在 mult 中调用正确的虚拟方法

C++ Calling correct virtual method in mult

本文关键字:虚拟 方法 调用 mult C++      更新时间:2023-10-16

我正在编写一些模块化应用程序,我正在尝试使用抽象类和(纯)虚拟函数/方法,如接口。

所以我定义了一些"接口":

class first { 
public: 
  virtual ~first() {}; 
  virtual void first_method() = 0;
};
class second { ... second_method() ... };

以及实现这些的类:

class TheObject : public BaseClass, public first, public second {
public: 
  void first_method();
  void second_method();
}
void TheObject::first_method() { do_something();} 
void TheObject::second_method() { do_something_better();} 

顺便说一句,BaseClass也有一些虚拟(但不是纯粹的)方法。

好的,现在,当我执行所有 dlopen、dlsym 等操作时,我将尝试将 TheObject(来自 TheObject)传递给插件,如下所示:

//In main app
pluginit(this);
// In plugin:
void pluginit (void * obj) {
    first * cls = (first*) obj;
    cls->first_method();  // FAIL!
}

按照//FAIL!,程序转到 BaseClass 的某个虚拟方法。我想我知道为什么 - 在编译时插件首先只看到"接口"并且不知道,vtable 包含更多的"接口"。

问题是 - 如何正确地将此接口传递给不知道 TheObject 的插件?类似的东西

new first : this; // typeof this = TheObject

谢谢!

转换为 void 指针不会神奇地考虑基类。如果您将某些内容转换为 void 指针,您所能做的就是将其转换回您原来的类型

所以你需要这样做:

derived * obj = new derived;
void * arg = static_cast<first *>(obj);      // upcast first!
f(arg);
// ... 
void f(void * p)
{
    first * obj = static_cast<first *>(p);   // all you know is that p
                                             // is a base pointer
    obj->foo();
}