gpt4 book ai didi

c - 用 C 预处理器模拟继承

转载 作者:行者123 更新时间:2023-12-04 03:05:38 25 4
gpt4 key购买 nike

我有一个关于如何在 C 中实现接口(interface)的想法。这个想法非常简单,但是在搜索讨论此问题的问题时,我没有看到它被提及。

所以,C中的“标准”继承模拟方法本质上是

struct dad {
arm_t right_arm;
arm_t left_arm;
}

struct kid {
struct dad parent;
diaper_t diaper;
}

我认为这很丑陋,因为 kid.parent.right_arm 不如 kid.right_arm 有意义。显然还有另一种方法,如果您不介意使用 gcc-exclusive 标志,这类似于

struct kid {
struct dad;
diaper_t diaper;
}

但这不是可移植的。然而,便携的是

// file: dad.interface
arm_t right_arm;
arm_t left_arm;

// file: kid.h
struct kid {
#include dad.interface
diaper_t diaper;
}

出于这个问题的目的,我对替代方案的建议不感兴趣。我的问题很简单:这种方法有什么问题(如果有的话)?

最佳答案

既然你在继承的背景下提出问题,我想一个更完整(和正确)的例子是这样的:

文件:dad.interface

arm_t right_arm;
arm_t left_arm;

文件dad.h

struct dad {
#include "dad.interface"
};

文件:kid.h

struct kid {
#include "dad.interface"
diaper_t diaper;
};

这有几个问题,其中:

  1. 这并不是真正的继承——它只是两个结构恰好具有匹配的初始成员。 struct kidstruct dad 没有其他关系,前者当然不会继承后者的任何东西。从 struct kid 的角度来看,甚至不清楚是否存在 struct dad

  2. 虽然您没有使用该术语,但人们普遍(尽管没有根据)认为多态性 与继承密切相关。你不会用你的方法得到它。尽管共享一个公共(public)的初始成员序列,但这两种结构类型是不兼容的,并且指向这些类型的指针也是不兼容的,因为标准使用了该术语。特别是,通过 struct dad * 类型的指针访问 struct kid 违反了严格的别名规则,因此会产生未定义的行为。 (当 struct kid 嵌入一个 struct dad 作为它的第一个成员时,这同样不适用。)

  3. 该方法的可扩展性较差。例如,假设您要添加继承自 struct kidstruct sonstruct daughter。现在您还必须将 struct kid 的成员也拉出到它自己的单独 header 中。我想如果你能预测任何人可能想要继承的结构类型,或者如果你只是对每一种结构类型都这样做,你就可以先发制人地做到这一点。哎呀,真是一团糟。

关于c - 用 C 预处理器模拟继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44806131/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com