Там есть два макроса:
G_DECLARE_FINAL_TYPE
G_DECLARE_DERIVABLE_TYPE
Если использовать первый, то там зафиксирован тип(класс):
typedef struct { ParentName##Class parent_class; } ModuleObjName##Class; \
и поэтому в него не получится дописывать виртуальные функции.
А если использвоать второй, то там зафиксирован объект:
struct _##ModuleObjName { ParentName parent_instance; };
и поэтому в него не получится дописывать переменные-члены.
Можно, конечно, сделать два класса: первый с функциями, второй - наследник от первого с перменными-членами. Но это, на мой взгляд, избыточно.
Вопрос: что нужно писать вместо макросов, G_DECLARE_FINAL_TYPE и G_DECLARE_DERIVABLE_TYPE, чтобы можно было добавлять и виртуальные функции и переменные-члены?