加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C继承通过类型惩罚,没有包含?

发布时间:2020-12-16 07:05:58 所属栏目:百科 来源:网络整理
导读:我需要在C中使用一些面向对象的特性,特别是继承.幸运的是,堆栈溢出有一些很好的参考,特别是这个 Semi-inheritance in C: How does this snippet work?和这个 Object-orientation in 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 *到外部对象的代码
一个联合u *或malloc’ed对象可以合法地将它转换为一个联盟u *
如果它与那种类型对齐,它可以合法地投射结果
指向struct s2 *的指针,并且使用访问struct s1 *或struct s2 *的效果必须与通过v1或v2成员访问union相同.因此,编译器使所有指示规则工作的唯一方法是将一个结构类型的指针转??换为另一个类型的指针并使用该指针检查公共初始序列的成员将起作用.

遗憾的是,编译器编写者已经说CIS规则仅适用于底层对象具有union类型的情况,尽管事实上这样的事情代表了一种非常罕见的用例(与存在联合类型的情况相比)让编译器知道结构的指针应该可以互换处理以便检查CIS),并且因为代码很少接收到一个struct s1 *或struct s2 *来标识一个union u中的对象,所以认为他们应该被允许忽视这种可能性.因此,即使上面的声明是可见的,gcc也会假设struct s1 *永远不会用于从struct s2 *访问CIS的成员.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读