在C ++中继承C结构并将其传回C库是否安全?

时间:2017-10-02 22:02:03

标签: c++ c oop inheritance casting

基本上,我希望在C ++中继承一个C结构(好吧,字面意思)。我有:

struct foo { // C-side definition
    int sz;
    /* whatever */
    // no virtual destructor, special mechanism
};

class cxx_class { 
    /* something here */
    // no virtual destructor, no need
};

class derived : public foo /*, public cxx_class */ {
    /* some other stuff here */
};

derived个实例(以foo*的形式)将被传递回外部库,该库只知道并使用foo derived部分(当然)。但问题是(我假设)库只使用c样式强制转换,相当于C ++中的reinterpret_castfoo中的derived必须位于内存的开头块。

我想知道这是否是定义的行为并且标准保证这个吗?

换句话说:

编辑: 这两个问题与答案中指出的不一样,此部分未得到解答。

有时我使用static_cast进行向下转播。但有些代码使用reinterpret_cast是否保证两者总是给出相同的答案?

3 个答案:

答案 0 :(得分:7)

  

foo*个实例(以foo的形式)将被传递回外部库,该库只知道并使用derived foo*部分(当然)。

如果您的功能采用foo,则无关紧要。即使构建类型的方式derived未放置在derived*的开头,从foo*到{{1}}的转换也会发生在知道的C ++代码中关于类型布局。外部功能则无需担心。

答案 1 :(得分:2)

  

标准保证这个吗?

没有

由于您没有虚拟方法,为什么不让foo成为derived的第一个成员?

然后用static_assert检查派生类是standard_layout,这是一个相对较好的保证。

答案 2 :(得分:1)

当该层次结构中的多个类具有非静态数据成员时,该标准对类层次结构的布局没有要求。

现在,如果derivedcxx_class为空(没有非静态数据成员),则derived应为C中的标准布局类型++ 11 +。