3

只是这个奇怪问题的一点背景:我有一个网络框架(RTI DDS),它有一个 C 序列化函数,它接受一个指针并将 C 结构转换为字符串。

它也(并且也设计用于)C++ 类。但是,如果我通过添加虚函数使 C++ 类具有多态性,则此序列化功能会出现段错误,有时甚至更糟,会提供错误的输出。

我假设它在内部对结构的内存布局做出了假设。

是否可以从多态 C++ 对象中获取原始 C 指针?

我知道我可以创建每个结构两次,一次是多态的,一次是非多态的,但这会导致大量的胶水代码。

目前我没有想法。

一些技术背景: C 函数在 RTI DDS Source 包中:

DynamicData.c DDS_ReturnCode_t DDS_DynamicData_to_cdr_buffer(...) { ..

4

2 回答 2

4

您可以添加仅包含数据的非虚拟基础struct

struct DataXYBase {
    int data1;
    double data2;
};

class VirtualBaseClass : public DataXYBase {
    virtual void Function1();
};

class DerivedClass : public VirtualBaseClass {
    virtual void Function1();
};

然后DataXYBase在将其传递给序列化函数之前强制转换为。

于 2015-09-24T14:28:04.777 回答
3

我认为您应该将所有数据捆绑在 POD 结构中(它们可能可以相互继承)以及包含数据结构的多态类中的所有访问器/逻辑作为成员(甚至可能通过继承)。您将只序列化数据部分,并为来自数据结构的多态类提供简单的构造函数。

这应该会限制必要的粘合量,并且仍然在您的代码中保留所需的多态性。

于 2015-09-24T14:27:15.633 回答