Там есть два макроса:
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, чтобы можно было добавлять и виртуальные функции и переменные-члены?