C多态实现

作者: 霡霂976447044 | 来源:发表于2019-02-28 21:51 被阅读0次
    #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

    相关文章

      网友评论

        本文标题:C多态实现

        本文链接:https://www.haomeiwen.com/subject/ktrluqtx.html