我正在编写一些模块化应用程序,并且正在尝试使用抽象类和(纯)虚拟函数/方法,例如接口。
所以我定义了一些“接口”:
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
谢谢!