这样做是否有副作用:
C代码:
struct foo { int k; }; int ret_foo(const struct foo* f){ return f.k; }
C++代码:
class bar : public foo { int my_bar() { return ret_foo( (foo)this ); } };
这里有一个extern "C"
围绕着C++代码,并且每个代码本身编译单元内.
这可以跨编译器移植吗?
这完全合法.在C++中,类和结构是相同的概念,但默认情况下所有结构成员都是公共的.这是唯一的区别.因此,询问是否可以扩展结构与询问是否可以扩展类没有什么不同.
这里有一个警告.有没有保证的布局一致,从编译器编译器.因此,如果使用与C++代码不同的编译器编译C代码,则可能会遇到与成员布局相关的问题(特别是填充).使用来自同一供应商的C和C++编译器时甚至会发生这种情况.
我有过这种情况用gcc和g ++.我参与了一个使用了几个大型结构的项目.不幸的是,g ++打包的结构明显比gcc松散,这导致在C和C++代码之间共享对象时出现重大问题.我们最终不得不手动设置打包和插入填充,以使C和C++代码对结构进行相同的处理.但请注意,无论子类化如何,都可能出现此问题.事实上,在这种情况下,我们并没有对C结构进行子类化.
我当然不建议使用这种奇怪的子类.最好将设计更改为使用合成而不是继承.只做一个成员
foo*m_pfoo;
在酒吧班,它将做同样的工作.
您可以做的另一件事是再创建一个类FooWrapper,其中包含具有相应getter方法的结构.然后你可以继承包装器.这样,虚拟析构函数的问题就消失了.