将vtable类转换为void指针(C ++)

时间:2017-11-21 16:52:55

标签: c++

我正在编写应该初始化一些数据并返回void指针的库。然后在C代码中使用指针。 在库内部我想使用C ++类来初始化这些数据。

void *init()
{
    return new MyData();
}
void fini(void *d)
{
    MyData *m = reinterpret_cast<MyData *>(d);
    delete d;
}

这是有效的,而MyData是没有虚方法的简单类。但现在我希望MyData成为抽象类的实现。

class Base // No virtual things
{
   int val;
};
class A : public Base // Abstract class
{
    virtual int x() = 0;
};
class B : public A // Implementation
{
    int x() {return val;}
};

如果我然后将此类转换为void *,则前4个字节的数据将不会反映&#34; val&#34;基类的变量。因为vtable可能吗?好吧,我明白这是错误的投射方式。有什么建议?像

这样的东西
return static_cast<Base *>(new MyData);

似乎工作但我还需要从void *重建MyData并正确删除它。 C程序只使用MyData的Base部分中的值。

这是替代

void *init()
{
    return new MyData();
}
void fini(void *d)
{
    delete reinterpret_cast<MyData *>(d);
}
void *getbase(void *d)
{
    MyData *m = reinterpret_cast<MyData *>(d);
    return static_cast<Base *>(m);
}

但我想避免第三个功能。谢谢,抱歉我的英语。

1 个答案:

答案 0 :(得分:1)

std::string_view sv("hello folks")

参与所有测试。感谢geza。