LINUX.ORG.RU

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

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

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

пусть наследование глубокое, ну там хотя бы три предка в иерархии. A <- B <- C <- D.

А - самый первый предок. как из функций класса D обращаться к полям класса A? ну понятно что можно, извращенчески перечислив все эти встраивания и добравшись до поля класса A. а как потом этот код сопровождать? если все будет слетать, стоит в иерархии что-то поменять.

смысл наследования не в том, чтобы встроить предка первым полем, а в том, чтобы писать иерархии произвольной глубины, и получать автоматическую совместимость по указателям, с проверкой корректности.

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

это непроверяемо, ниоткуда не следует, что преобразование к типу object в данном случае корректно, - значит все ваши простыни с эмуляцией ооп в си, придется вычитывать глазками, не дай бог изменится что-то в иерархии классов. с эмуляцией виртуальных методов все еще более усложнится, а с не дай бог множественным наследованием это будет нереально читать вообще

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

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

пусть наследование глубокое, ну там хотя бы три предка в иерархии. A <- B <- C <- D А - самый первый предок. как из функций класса D обращаться к полям класса A? ну понятно что можно, извращенчески перечислив все эти встраивания и добравшись до поля класса A. а как потом этот код сопровождать? если все будет слетать, стоит в иерархии что-то поменять.

смысл наследования не в том, чтобы встроить предка первым полем, а в том, чтобы писать иерархии произвольной глубины, и получать автоматическую совместимость по указателям, с проверкой корректности.

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

это непроверяемо, ниоткуда не следует, что преобразование к типу object в данном случае корректно, - значит все ваши простыни с эмуляцией ооп в си, придется вычитывать глазками, не дай бог изменится что-то в иерархии классов. с эмуляцией виртуальных методов все еще более усложнится, а с не дай бог множественным наследованием это будет нереально читать вообще