首页 文章

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

提问于
浏览
0

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

所以我定义了一些“接口”:

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

谢谢!

1 回答

  • 1

    转换为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();
    }
    

相关问题