История изменений
Исправление 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 в данном случае корректно, - значит все ваши простыни с эмуляцией ооп в си, придется вычитывать глазками, не дай бог изменится что-то в иерархии классов. с эмуляцией виртуальных методов все еще более усложнится, а с не дай бог множественным наследованием это будет нереально читать вообще