Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Héritage multiple et fonction virtuelle pure

2 réponses
Avatar
Vincent Richard
Bonsoir,

Soit le cas d'héritage multiple suivant :

// interfaces
struct a
{
virtual int f() = 0; // ligne 7
};

struct b : public a
{
};

// une implémentation
struct A : public a
{
int f() { return 1234; }
};

struct B : public b, public A
{
};


int main()
{
b* myB = new B; // ligne 29
}

A la compilation, le compilateur indique :

hm.cpp: Dans function « int main() »:
hm.cpp:29: error: cannot allocate an object of type `B'
hm.cpp:29: error: because the following virtual functions are abstract:
hm.cpp:7: error: virtual int a::f()

Il ne devrait pourtant pas y avoir besoin de réimplémenter f() une "seconde"
fois puisqu'un B est aussi un A, je me trompe ?

Comment puis-je résoudre facilement ce problème tout en gardant mon schéma
d'héritage ? (raison : un 'B' est un 'A' qui contient d'autres 'A', et 'a'
et 'b' sont les interfaces respectives de 'A' et 'B'.)

Merci d'avance pour vos réponses.

Vincent

--
vmime, une bibliothèque C++ sous licence GPL pour parser et générer
des messages au format MIME : http://www.sourceforge.net/projects/vmime/

2 réponses

Avatar
Alexandre
voici la solution :
struct a
{
virtual int f() = 0; // ligne 7
};

struct b : virtual public a
{
};

// une implémentation
struct A : virtual public a
{
int f() { return 1234; }
};

struct B : public b, public A
{
};


int main()
{
b* myB = new B; // ligne 29
}

la différence ? L'ancêtre commun 'a' est hérité en *virtuel* pour A et b.
Donc le membre int f() n'est présent qu'une seule fois. Donc c'est A::f qui
est utilisée pour B::f, sinon, dans ton cas, B possédait *deux* méthodes f,
A::f et b::f; donc une virtuelle pure...

Pénible, l'héritage multiple, non ?
Avatar
Vincent Richard

voici la solution :
struct a
{
virtual int f() = 0; // ligne 7
};

struct b : virtual public a
{
};

// une implémentation
struct A : virtual public a
{
int f() { return 1234; }
};

struct B : public b, public A
{
};


Je venais juste de trouver la réponse en consultant la C++ FAQ Lite :
http://www.parashift.com/c++-faq-lite/multiple-inheritance.html#faq-25.8

la différence ? L'ancêtre commun 'a' est hérité en *virtuel* pour A et b.
Donc le membre int f() n'est présent qu'une seule fois. Donc c'est A::f
qui est utilisée pour B::f, sinon, dans ton cas, B possédait *deux*
méthodes f, A::f et b::f; donc une virtuelle pure...


Merci pour l'explication.

Vincent

--
vmime, une bibliothèque C++ sous licence GPL pour parser et générer
des messages au format MIME : http://www.sourceforge.net/projects/vmime/