Это можно реализовать преобразованием указателя на существующую структуру в структуру-трейт, который описывает нужные свойства. Но при таком подходе, при несоответствии трейту, будет Segmentation Fault
#include <stdio.h>
void say_colour(char *s);
void say_colour(char *s){ printf("машина цветом %s",s);}
typedef struct { // Трейт
char z[10];
void(*say_colour)(char* s);
} Colour;
typedef struct {
char z[10];
void(*say_colour)(char *s);
int a; // Доп свойство
} Blue;
typedef struct{
Colour* colour;
} Car;
int main(int argc, char const *argv[]){
Blue b = {.z ="blue",.say_colour=say_colour};
Car car = {
.colour = (Colour*)&b // Преобразуем Blue в Colour
};
car.colour->say_colour("dsfd");
return 0;
}