LINUX.ORG.RU

История изменений

Исправление PPP328, (текущая версия) :

Наследование, сейчас покажу:

#include <stdio.h>

struct object {
    int time;
};

struct cube {
    struct object object;
    int width;
};

struct ball {
    struct object object;
    int diameter;
};

static void print_object(struct object * object) {
    printf("time = %d\n", object->time);    
}

static void print_cube(struct cube * cube) {
    printf("width = %d\n", cube->width);
}

static void print_ball(struct ball * ball) {
    printf("diameter = %d\n", ball->diameter);
}

int main()
{
    struct object object = { .time = 5 };
    struct cube   cube   = { .object = { .time = 4 }, .width    = 5 };
    struct ball   ball   = { .object = { .time = 8 }, .diameter = 7 };
    
    print_object(&object);
    print_cube  (&cube);
    print_ball  (&ball);

    print_object((struct object *)&cube);
    print_object((struct object *)&ball);

    return 0;
}

time = 5                                                                                                                                                                        
width = 5                                                                                                                                                                       
diameter = 7                                                                                                                                                                    
time = 4                                                                                                                                                                        
time = 8 

Совместимость указателей никого не волнует, можете макрос каста сделать.

Факт в том, что cube и ball - расширяют функционал object, если он идет первым.

Исходная версия PPP328, :

Наследование, сейчас покажу:

#include <stdio.h>

struct object {
    int time;
};

struct cube {
    struct object object;
    int width;
};

struct ball {
    struct object object;
    int diameter;
};

static void print_object(struct object * object) {
    printf("time = %d\n", object->time);    
}

static void print_cube(struct cube * cube) {
    printf("width = %d\n", cube->width);
}

static void print_ball(struct ball * ball) {
    printf("diameter = %d\n", ball->diameter);
}

int main()
{
    struct object object = { .time = 5 };
    struct cube   cube   = { .object = { .time = 4 }, .width    = 5 };
    struct ball   ball   = { .object = { .time = 8 }, .diameter = 7 };
    
    print_object(&object);
    print_cube  (&cube);
    print_ball  (&ball);

    print_object((struct object *)&cube);
    print_object((struct object *)&ball);

    return 0;
}


About • FAQ • Blog • Terms of Use • Contact Us • GDB Tutorial • Credits • Privacy
© 2016 - 2020 GDB Online
       Language 
C
  
main.c



  
input
time = 5                                                                                                                                                                        
width = 5                                                                                                                                                                       
diameter = 7                                                                                                                                                                    
time = 4                                                                                                                                                                        
time = 8 

Совместимость указателей никого не волнует, можете макрос каста сделать.

Факт в том, что cube и ball - расширяют функционал object, если он идет первым.