将VTable类铸造为void指针(C )

Casting vtable class to void pointer (C++)

本文关键字:指针 void VTable      更新时间:2023-10-16

我正在编写库,该库应该初始化一些数据并返回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*,则第一个数据的数据将不会反映基类的" val"变量。因为可vtable?很好,我知道这是错误的方式。有什么建议么?像

return static_cast<Base *>(new MyData);

似乎有效,但我还需要从void *重建mydata并正确删除它。C程序将仅使用MyData基部的值。

这是替代

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);
}

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

delete static_cast<A*>(static_cast<Base *>(d));

在所有测试中都有工作。感谢geza。