J'ai les classes GLib Foo
et DerivedFoo
.Comment gérer le type de pointeur incompatible lors de l'affectation de méthodes virtuelles dans une classe dérivée?
La classe Foo
a une méthode bar()
:
typedef struct _FooClass
{
GObjectClass parent_class;
void (*bar) (Foo *self);
} FooClass;
La classe DerivedFoo
dérive de Foo
et met en œuvre la méthode bar()
:
void derived_foo_bar (DerivedFoo *self);
static void
derived_foo_class_init (DerivedFooClass *klass)
{
FooClass *foo_class = FOO_CLASS (klass);
// Compiler warning appears here
foo_class->bar = derived_foo_bar;
}
Le message d'avertissement est:
warning: assignment from incompatible pointer type
Les pointeurs ne sont pas compatibles, car le type du paramètre self
est différent (Foo *
par rapport à DerivedFoo *
).
Est-ce la bonne façon d'implémenter des méthodes virtuelles dans GObject?
Si oui, peut/devrais-je faire quelque chose à propos de l'avertissement du compilateur?
Comment 'DerivedFoo' dérive-t-il de' Foo'? Il n'y a pas d'héritage dans C. – atturri
Cette question est un bon moyen de lancer un argument sur la [règle d'alias strict] (https://stackoverflow.com/questions/98650/what-is-the-strict-aliasing-rule) . – user3386109
Vous pouvez le transformer en 'foo_class-> bar = (void (*) (Foo *)) derived_foo_bar;'. Je suppose que l'utilisation judicieuse de 'typedef' et/ou de macros le rendrait moins moche! –