On Thu, Jul 27, 2006 at 02:24:23AM -0400, Nikhil Dinesh wrote: > I'm trying to create my own object hierarchy, and I don't > understand the part in the API reference about virtual > functions and chaining up. To create a virtual public > method, the docs say we need to do something like: > > /* declaration in maman-bar.h. */ > struct _MamanBarClass { > GObjectClass parent; > > /* stuff */ > void (*do_action) (MamanBar *self, /* parameters */); > }; > void maman_bar_do_action (MamanBar *self, /* parameters */); > /* implementation in maman-bar.c */ > void maman_bar_do_action (MamanBar *self, /* parameters */) > { > MAMAN_BAR_GET_CLASS (self)->do_action (self, /* parameters */); > }
Correct. > I assume that the subclass definition looks like: > > struct _MamanBarSubClass { > MamanBarClass parent; > > .... > > void (*do_action) (MamanBarSub* self, /* params */); > } No, there's already one do_action() in parent, so this is a second one. Moreover the parent class has no access to this second do_action() so maman_bar_do_action() can never invoke it. Each class has its own class struct which contains all ancestors's class structs (like a matryoshka). When its class_init() method is called, the fields defined in ancestors classes are already filled with parent's values. So you only need to override them. > If the maman_bar_do_action actually needs to do something, and > the derived class needs to chain up, maman_bar_do_action() is *not* the parent class method, it's the virtual method for users to call. The child method calls its parent's method: MAMAN_BAR_CLASS(maman_bar_sub_parent_class)->do_action(). See Gtk+ source code for examples... Yeti -- Anonyms eat their boogers. _______________________________________________ gtk-app-devel-list mailing list gtk-app-devel-list@gnome.org http://mail.gnome.org/mailman/listinfo/gtk-app-devel-list