【问题标题】:Can we implement inheritence in C [duplicate]我们可以在C中实现继承吗?
【发布时间】:2014-01-09 00:39:57
【问题描述】:

我看到我们可以在 ANSI C 中实现多重继承? 因为我们可以创建任何类,如

struct sampleClass {
    int size;
    struct sampleClass *ptr1;
};

当我试图创建类并想要实现继承时。你能给我一些想法如何实现吗?

【问题讨论】:

  • 你问的是something like this吗?
  • 当然可以在 C 中实现多重继承。事实上,第一个 C++ 编译器创建了由普通 C 编译器编译的 C 代码。不过事情没那么简单。
  • C 结构不是 OOP 意义上的“类”。它们只是数据字段的集合,OOP“类”也应该有方法并支持继承。你可以在 C 中实现几乎任何东西,包括任何 OOP 机制,但你必须自己做,在代码中,编译器不会为你做,所以结果会很冗长和混乱。
  • @XORcist C 带有类、这个和那个以及其他花哨的东西,那就是 C++。但两者都被认为是不同的语言。
  • 也许你应该从单继承开始?如果这里有一个很好的文章,有一些实现选项和注意事项:lwn.net/Articles/444910

标签: c inheritance


【解决方案1】:

我以前见过这样做。

#include "stdio.h"

#define FRUIT_COLOR_RED   1

struct fruit {
    char* name;
};

struct apple {
    struct fruit base;
    int color;
};

void printFruit(struct fruit *f) {
    printf(f->name);
}

int main(int argc, char** argv) {
    struct apple a;
    a.base.name = "apple";
    a.color = FRUIT_COLOR_RED;

    printFruit((struct fruit*)&a);

    return 0;
}

这是因为 struct fruit 是 struct apple 的第一个成员,并且这两个结构在内存中是对齐的。

|-- 4 或 8 字节(char*) --| => 在内存中构造水果

|-- 4 或 8 字节(char*) --|-- 4 或 8 字节(int) --| => 在内存中构造苹果

前 4 或 8 个字节(分别取决于 32 位和 64 位)的长度和类型相同,因此您可以将 struct apple* 强制转换为 struct fruit* 并且因为它们在内存中排列,它会读取成员结构果实。

我不知道这是否是一种好的做法,我会避免它。我喜欢 C 的简单性,但为什么不使用内置这些结构的语言,例如 C++。

在 C 中实现面向对象的特性意味着更多的代码行和更多的维护。

此外,如果代码没有构建,我现在在记事本中编写它,但概念就在那里。目前我没有 C 编译器 :-(.

【讨论】:

    【解决方案2】:

    这取决于您所说的“在 C 中实现 inheritance”是什么意思。

    它肯定是用宏、编码指南和样式,以及函数指针的struct(模仿virtual method table)和其他metadata 完成的。一个很好的例子来自GTK 及其GObject 层。

    【讨论】:

      猜你喜欢
      • 2016-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-29
      • 1970-01-01
      • 2023-03-28
      相关资源
      最近更新 更多