我正在编写一些模块化应用程序,我正在尝试使用抽象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
谢谢!
答案 0 :(得分:1)
转换为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();
}