是否可以在C++中子类化C结构并在C代码中使用指向结构的指针?

Edu*_*ipe 24 c c++ gcc extern-c

这样做是否有副作用:

C代码:

struct foo {
      int k;
};

int ret_foo(const struct foo* f){ 
    return f.k; 
}
Run Code Online (Sandbox Code Playgroud)

C++代码:

class bar : public foo {

   int my_bar() { 
       return ret_foo( (foo)this ); 
   }

};
Run Code Online (Sandbox Code Playgroud)

这里有一个extern "C"围绕着C++代码,并且每个代码本身编译单元内.

这可以跨编译器移植吗?

Der*_*ark 28

这完全合法.在C++中,类和结构是相同的概念,但默认情况下所有结构成员都是公共的.这是唯一的区别.因此,询问是否可以扩展结构与询问是否可以扩展类没有什么不同.

这里有一个警告.有没有保证的布局一致,从编译器编译器.因此,如果使用与C++代码不同的编译器编译C代码,则可能会遇到与成员布局相关的问题(特别是填充).使用来自同一供应商的C和C++编译器时甚至会发生这种情况.

过这种情况用gcc和g ++.我参与了一个使用了几个大型结构的项目.不幸的是,g ++打包的结构明显比gcc松散,这导致在C和C++代码之间共享对象时出现重大问题.我们最终不得不手动设置打包和插入填充,以使C和C++代码对结构进行相同的处理.但请注意,无论子类化如何,都可能出现此问题.事实上,在这种情况下,我们并没有对C结构进行子类化.

  • 实际上,结构体和类之间还有另一个区别:基类的默认可见性在结构体中是公共的,而在类中是私有的。 (2认同)

m_p*_*tor 11

我当然不建议使用这种奇怪的子类.最好将设计更改为使用合成而不是继承.只做一个成员

foo*m_pfoo;

在酒吧班,它将做同样的工作.

您可以做的另一件事是再创建一个类FooWrapper,其中包含具有相应getter方法的结构.然后你可以继承包装器.这样,虚拟析构函数的问题就消失了.