Tag: inheritance

C中的半inheritance:这个代码片段如何工作?

在C中破解有限forms的多态性的一种方法是执行以下操作: typedef struct { int x; } base; typedef struct { base super; int y; } derived; 现在,您可以将派生实例作为基本实例引用,具体取决于变量的转换方式,即: derived my_derived; my_derived.y = 10; my_derived.super.x = 20; //will print 10 printf(“%d”, (&my_derived)->y); //will print 20 printf(“%d”, ((base*)(&my_derived) )->x); 所以我的问题是,这究竟是如何工作的? 是因为当你把它作为基础并引用变量时,你引用int成员’x’作为’base’结构开头的偏移量? 这是我唯一能想到的,任何帮助都会受到赞赏。 非常感谢!

通过在作为另一个结构的一个结构而不是第一个成员的结构之间转换指针来实现C中的inheritance是否合法?

现在我知道我可以通过将指向struct的指针强制转换为该struct的第一个成员的类型来实现inheritance。 然而,纯粹作为一种学习经验,我开始想知道是否有可能以稍微不同的方式实现inheritance。 这段代码合法吗? #include #include struct base { double some; char space_for_subclasses[]; }; struct derived { double some; int value; }; int main(void) { struct base *b = malloc(sizeof(struct derived)); b->some = 123.456; struct derived *d = (struct derived*)(b); d->value = 4; struct base *bb = (struct base*)(d); printf(“%f\t%f\t%d\n”, d->some, bb->some, d->value); return 0; } […]

你如何为inheritance的c ++类编写ac包装器

我只是想知道是否有办法为具有inheritance的c ++类创建ac包装器API。 考虑以下: class sampleClass1 : public sampleClass{ public: int get() { return this.data *2; }; void set(int data); } class sampleClass : public sample{ public: int get() { return this.data; } void set(int data) {this.data = data; } } class sample { public: virtual int get(); virtual void set(int data); private: int data; } […]

通过展开inheritance是否违反了严格的别名规则?

我有一个inheritance自struct Base的struct X. 但是,在我目前的设置中,由于对齐,X的大小为24B: typedef struct { double_t a; int8_t b; } Base; typedef struct { Base base; int8_t c; } X; 为了节省内存,我想展开Base结构,所以我创建了包含Base的字段的struct Y(以相同的顺序,总是在struct的开头),所以struct的大小是16B : typedef struct { double_t base_a; int8_t base_b; int8_t c; } Y; 然后我将在一个方法中使用struct Y的实例,该方法需要一个指向Base结构的指针: void print_base(Base* b) { printf(“%f %d\n”, b->a, b->b); } // … Y data; print_base((Base*)&data); 上面的代码是否违反了严格的别名规则,并导致未定义的行为?

有没有办法让GCC / Clang知道C中的inheritance?

我正在编写一个C库,它使用一些简单的面向对象的inheritance,如下所示: struct Base { int x; }; struct Derived { struct Base base; int y; }; 现在我想将Derived *传递给一个带有Base *的函数: int getx(struct Base *arg) { return arg->x; }; int main() { struct Derived d; return getx(&d); }; 这是有效的,当然是类型安全的,但编译器不知道这一点。 有没有办法告诉编译器这是类型安全的? 我只关注GCC并在这里铿锵作响,因此欢迎编译器特定的答案。 我有一些模糊的记忆,看到一些代码使用__attribute__((inherits(Base))或类似的东西,但我的记忆可能在撒谎。

简单的结构inheritance和伪多态与vs严格别名

如果有人回答我的问题,请不要告诉我使用C ++ 。 所以,我在C中创建了一个使用面向对象方法的小型库。 我选择在C中使用两种主要的inheritance方法中较不常见的方法:将基类型的成员复制到派生类型的开头。 像这样的东西: struct base { int a; int b; char c; }; struct derived { int a; int b; char c; unsigned int d; void (*virtual_method)(int, char); }; 这种方法不如另一种方法(基类型的实例作为派生类型的第一个成员)受欢迎,因为 从技术上讲,没有标准保证基础和派生结构的第一个共同成员将具有相同的抵消。 但是,除了其中一个结构被打包而另一个结构没有被打包的情况之外,它们将在大多数(如果不是全部)已知编译器上具有相同的偏移量。 这种方法最严重的缺陷:它违反了严格的别名 。 将指向派生结构的指针转换为其基类型然后解除引用指针在技术上是未定义的行为。 但是,与其他方法相比,它也有其优点: 更少详细:访问已inheritance的派生结构的成员与访问尚未inheritance的结构相同,而不是转换为基类型, 然后访问所需的成员; 这实际上是真正的inheritance而不是构成 ; 虽然可能需要一些预处理器滥用,但它与其他方法一样容易实现; 我们可以得到一个实际多重inheritance的半生不熟的forms,我们可以从几个基类型inheritance,但只能转换为其中一个。 我一直在寻找使我的库编译和使用强制执行严格别名(如gcc )的编译器正确工作的可能性,而无需用户手动关闭它。 以下是我研究过的可能性: 工会。 遗憾的是,由于以下几个原因,这些是禁忌: 详细程度回归! 要遵循通过联合访问2个结构的第一个共同成员的标准规则,必须(从C99开始)明确使用联合来访问第一个共同成员。 我们需要特殊的语法来访问联合中每种类型的成员! 空间。 考虑一个inheritance层次结构。 […]

人们使用什么技术/策略来构建C(而不是C ++)中的对象?

我特别感兴趣的是在C语言中使用的对象,而不是构成解释语言核心的对象的实现,例如python。