Now, we will begin to implement some real OO mechanism using GObject library. In this article, we will make our fundamental type Inheritable.
Here’s comes our Base type:
NOTE: PLEASE READ ALL COMMENT CAREFULLY.
In base_instance_init()
, we assigned the base_instance_dump()
callback. Thus, we can invoke this function by both global function or instance function of BaseClass
class. Additional flags G_TYPE_FLAG_DERIVABLE
and G_TYPE_FLAG_DEEP_DERIVABLE
are also passed to the GTypeFundamentalInfo
struct to enable inheritance.
It’s time to define our Derived type:
Our Derived
type inherits Base
by replacing GTypeClass
and GTypeInstance
with the corresponding struct of the Base type. According to the memory layout of structs, GTypeClass
and GTypeInstance
are still the first member of corresponding struct. In derived_get_type()
, we register Derived
type using g_type_register_static()
since it’s not a fundamental at all. And the first parameter is the type id of Base
type.
Let’s have some time to look up how to implement polymorphism. In derived_class_init()
, we re-assign the base_instance_dump()
callback to from the Base
‘s implementation to Derived
‘s implementation.
Test code:
All source code is available in my skydrive: http://cid-481cbe104492a3af.office.live.com/browse.aspx/share/dev/TestOO. In the TestGObject-{date}.zip/TestGObject4 folder.