如何在c中实现继承类?

时间:2019-10-03 01:01:25

标签: c oop inheritance

我对继承和总体操作还很陌生,我仍在学习。但是,如果有人可以帮助我从下图开始我的UML设计进入代码实现的话。感谢您的帮助。谢谢您的帮助。

此外,我认为我的UML设计缺少某些内容。您可以检查我的UML设计是否缺少任何内容?

2 个答案:

答案 0 :(得分:3)

C不支持继承或OOP,因此您需要自己实现。有两种有用的技术很有帮助

结构扩展

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

Major  Minor  Build  Revision
-----  -----  -----  --------
5      1      14409  1005

在这里您可以(指向)DerivedClass的实例并将其强制转换为struct BaseClass { ...whatever }; struct DerivedClass { struct BaseClass base; ... derived class additions }; ,它将起作用。如果已知指针指向实际的DervicedClass,则也可以将BaseClass *投射回BaseClass *

元类对象

您可以使用包含函数指针的元类结构来实现OO调度

DerivedClass *

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

isa

派生的类不需要添加任何新方法就可以直接使用BaseMetaclass,也可以使用带有其他字段的结构扩展来定义 base_obj->isa->method1(base_obj); 。您还可以在元数据对象中放入您喜欢的任何其他面向类的数据(带有类名的字符串常量很有用)。

答案 1 :(得分:0)

在纯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;
}