C继承通过类型惩罚,没有包含?
我需要在C中使用一些面向对象的特性,特别是继承.幸运的是,堆栈溢出有一些很好的参考,特别是这个
Semi-inheritance in C: How does this snippet work?和这个
Object-orientation in C.这个想法是在派生类中包含一个基类的实例并对其进行类型转换,如下所示:
struct base { int x; int y; }; struct derived { struct base super; int z; }; struct derived d; d.super.x = 1; d.super.y = 2; d.z = 3; struct base b = (struct base *)&d; 这很好,但是对于深度继承树来说变得很麻烦 – 我会有大约5-6个“类”的链,我真的不会一直输入derived.super.super.super.super.super.super .我希望是我可以对前n个元素的结构进行类型转换,如下所示: struct base { int x; int y; }; struct derived { int x; int y; int z; }; struct derived d; d.x = 1; d.y = 2; d.z = 3; struct base b = (struct base *)&d; 我已经在Visual Studio 2012附带的C编译器上进行了测试,但是它可以工作,但我不知道C标准是否真的能够保证它.是否有人可能确定这是否可以?我不想写大量的代码只是为了发现它在如此基础的层面上被打破了. 解决方法
你在这里描述的是一个完全可移植的结构,基本上可以保证通过语言的设计工作,除了标准的作者认为没有必要明确要求编译器支持显然应该工作. C89为联合指定了公共初始序列规则,而不是指向结构的指针,因为给定:
struct s1 {int x; int y; ... other stuff... }; struct s2 {int x; int y; ... other stuff... }; union u { struct s1 v1; struct s2 v2; }; 接收结构s1 *到外部对象的代码 遗憾的是,编译器编写者已经说CIS规则仅适用于底层对象具有union类型的情况,尽管事实上这样的事情代表了一种非常罕见的用例(与存在联合类型的情况相比)让编译器知道结构的指针应该可以互换处理以便检查CIS),并且因为代码很少接收到一个struct s1 *或struct s2 *来标识一个union u中的对象,所以认为他们应该被允许忽视这种可能性.因此,即使上面的声明是可见的,gcc也会假设struct s1 *永远不会用于从struct s2 *访问CIS的成员. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |