C语言C语言&嵌入式

C多态实现

2019-02-28  本文已影响0人  霡霂976447044
#include <stdio.h>

typedef struct _object {
    char base;

} PyObject;

typedef struct {
    char base;
    int val;

} PyIntObject;

#if 0
typedef struct {
    int val;
    char base;

} PyIntObject;
#endif


void print_base(PyObject *obj) {
    printf("obj->base : %c\n", obj->base);
}

int main() {
    printf("sizeof(PyObject) : %ld\n", sizeof(PyObject)); // 1
    printf("sizeof(PyIntObject) : %ld\n", sizeof(PyIntObject)); // 8
    PyIntObject intObject = {'a', 999};
//    print_base(&intObject);  expected ‘PyObject * {aka struct _object *}’ but argument is of type ‘PyIntObject * {aka struct <anonymous> *}’
    print_base((PyObject *)&intObject);
    return 0;
}

output

sizeof(PyObject) : 1
sizeof(PyIntObject) : 8
obj->base : a

PyObject的结构体大小为1, 而PyIntObject为8,不同size的内存大小也是也可正确强制类型转化使用的。

void print_base(PyObject *obj) {
    printf("obj->base : %c\n", obj->base);
}

需要传进来一个PyObject类型的指针,调用的时候,

print_base((PyObject *)&intObject);

直接强制转换,当然,这样的前提是结构体的内存分配的前一部分必须要和父类一致,才能正确的调用。
如果改为

typedef struct {
    int val;
    char base;

} PyIntObject;

obj->base读取的内存就不是char base

上一篇下一篇

猜你喜欢

热点阅读