Re: Are vtables of interfaces always correctly initialized?

Let's see if I can clarify the reasoning in my previous message. I
continue to use GooCanvas classes as an example, but now I'll turn to a
syntax that resembles Java. The rules for inheritance hierarchies in
C/GObject are more like Java than like C++: Only single inheritance
between classes, but in addition to inheritance from a base class, a
class can implement zero or more interfaces.

public interface GooCanvasItem;
public class GooCanvasItemSimple implements GooCanvasItem;
public class GooCanvasRect extends GooCanvasItemSimple implements

The repetition of "implements GooCanvasItem" in GooCanvasRect is perhaps
not like Java, but it's GObject's way of overriding virtual functions
declared in the interface.

When gmmproc generates C++ wrappers for these entities,
g_type_register_static() and g_type_add_interface_static() are called
with the following results:

   No new type registered, no interface added.
   Goocanvas:Item effectively renames GooCanvasItem,
   and defines C++ virtual functions.

   public class gtkmm__GooCanvasItemSimple extends GooCanvasItemSimple
implements GooCanvasItem;

   public class gtkmm__GooCanvasRect extends GooCanvasRect;

I suspect that gtkmm__GooCanvasRect shall also implement GooCanvasItem,
i.e. Goocanvas::Item::add_interface(get_type()) shall be called from

Otherwise the C++ virtual functions in Goocanvas::Item are never called
in a class derived from Goocanvas::Rect. Since gtkmm__GooCanvasRect is
not derived from gtkmm__GooCanvasItemSimple, gtkmm__GooCanvasRect
(Goocanvas::Rect) does not inherit the implementation of GooCanvasItem
functions defined in gtkmm__GooCanvasItemSimple (Goocanvas::ItemSimple).

[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]