Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在c中实现继承类?_C_Oop_Inheritance - Fatal编程技术网

如何在c中实现继承类?

如何在c中实现继承类?,c,oop,inheritance,C,Oop,Inheritance,我对继承和总体opp还不熟悉,我还在学习。但是,如果有人能帮助我从下图开始,将UML设计转化为代码实现。我会感谢你的帮助。谢谢你的帮助 此外,我认为我的UML设计缺少一些东西。你能检查一下我的UML设计是否遗漏了什么吗?C不支持继承或OOP,所以你需要自己实现它。有两种有用的技术非常有用 结构扩展 C保证结构中的第一个字段将位于偏移量0处,因此可以在指向结构的指针和指向结构的第一个字段的指针之间自由转换。这样就可以轻松扩展结构以派生: struct BaseClass { ...w

我对继承和总体opp还不熟悉,我还在学习。但是,如果有人能帮助我从下图开始,将UML设计转化为代码实现。我会感谢你的帮助。谢谢你的帮助


此外,我认为我的UML设计缺少一些东西。你能检查一下我的UML设计是否遗漏了什么吗?

C不支持继承或OOP,所以你需要自己实现它。有两种有用的技术非常有用

结构扩展

C保证结构中的第一个字段将位于偏移量0处,因此可以在指向结构的指针和指向结构的第一个字段的指针之间自由转换。这样就可以轻松扩展结构以派生:

struct BaseClass {
       ...whatever
};

struct DerivedClass {
    struct BaseClass base;
    ... derived class additions
};
在这里,您可以获取一个(指向)DerivedClass实例的指针,并将其转换为
BaseClass*
,这样就可以了。如果已知指针指向实际的DervicedClass,则还可以将
基类*
强制转换回
派生类*

元类对象

可以使用包含函数指针的元类结构实现OO分派

struct BaseClass;
struct BaseMetaclass {
    void (*method1)(struct BaseClass *);
    int (*method2)(struct BaseClass *, int);
};
struct BaseClass {
    struct BaseMetaclass *isa;
    ....
};
现在,您可以创建一个由所有基类实例使用的基类元类实例,并通过
isa
指针调用该方法

  base_obj->isa->method1(base_obj);

如果派生类不需要添加任何新方法,则可以直接使用BaseMetaclass,或者可以使用结构扩展和其他字段定义
DeriveMetaClass
。您还可以将您喜欢的任何其他面向类的数据放在元数据对象中(带有类名称的字符串常量很有用)。

在纯C中,我实现了如下:

// in interface.h file
typedef struct st_interface interface_t;
typedef int32_t (*interface_fn)(interface_t *i);

struct st_interface {
     interface_fn fn1;
     interface_fn fn2;
     void* impl;
};

// in interface_impl.h
interface_t* interface_impl_new();

// in interface_impl.c file
typedef struct {
    // impl data
} interface_impl_t;

static int32_t interface_impl_fn1(interface_t* i) {
    interface_impl_t* impl = i->impl;
}

static int32_t interface_impl_fn2(interface_t* i) {
    interface_impl_t* impl = i->impl;
}

interface_t* interface_impl_new() {
     uint8_t* mem = malloc(sizeof(interface_t) + sizeof(interface_impl_t));

     if (mem == NULL) {
          return NULL;
     }

     interface_t* i = (interface_t*) mem;
     interface_impl_t* impl = (interface_impl_t*) (mem + sizeof(interface_t));

     *i = (interface_t) {
         .fn1 = interface_impl_fn1,
         .fn2 = interface_impl_fn2,
         .impl = impl,
     };

     *impl = (interface_impl_t) {
         // init impl
     };

     return i;
}

如果你在做继承,为什么是C?什么?这可能有点令人震惊,但是,您知道C没有OOP支持,对吗?C没有类或继承。这个问题没有意义。考虑一下这个PDF C++,抱歉……@ CyyGrGoGy是的,使用现有的OO语言比重新发明轮子要好,但是如果你必须使用C,因为它可以做。“ChrisDodd,你能给我展示一下我的UML设计吗?”thanks@user11703752这张图表很难阅读,很难做出准确的解释implementation@ChrisDodd也许这是可以做到的,但我从未见过它的成功实施,如果我真的做到了,我相信这将是一场人为的混乱,实施和维护的成本将超过它的价值。这工作用的工具不对。就这么简单。C++可以由任何知道C的人编写和维护,它实际上支持OP想要做的事情。谢谢你的回答。但是,这是我的oop继承UML设计的实现吗?UML图很难阅读,很难准确,此外,您需要做额外的工作。但是,UML图是否缺少正确的oop实现方式的任何部分?