当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《是否可以在C++中子类化C结构并在C代码中使用指向结构的指针?》经验,为你挑选了2个好方法。

这样做是否有副作用:

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++代码,并且每个代码本身编译单元内.

这可以跨编译器移植吗?



1> Derek Park..:

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

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

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



2> m_pGladiator..:

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

foo*m_pfoo;

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

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

推荐阅读
夏晶阳--艺术
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有