基本上,我希望在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_cast
,foo
中的derived
必须位于内存的开头块。
我想知道这是否是定义的行为并且标准保证这个吗?
换句话说:
编辑: 这两个问题与答案中指出的不一样,此部分未得到解答。
有时我使用static_cast
进行向下转播。但有些代码使用reinterpret_cast
是否保证两者总是给出相同的答案?
答案 0 :(得分:7)
foo*
个实例(以foo
的形式)将被传递回外部库,该库只知道并使用derived
foo*
部分(当然)。
如果您的功能采用foo
,则无关紧要。即使构建类型的方式derived
未放置在derived*
的开头,从foo*
到{{1}}的转换也会发生在知道的C ++代码中关于类型布局。外部功能则无需担心。
答案 1 :(得分:2)
标准保证这个吗?
没有
由于您没有虚拟方法,为什么不让foo
成为derived
的第一个成员?
然后用static_assert
检查派生类是standard_layout
,这是一个相对较好的保证。
答案 2 :(得分:1)
当该层次结构中的多个类具有非静态数据成员时,该标准对类层次结构的布局没有要求。
现在,如果derived
和cxx_class
都为空(没有非静态数据成员),则derived
应为C中的标准布局类型++ 11 +。