Heritage en diamant et virtual pure

Heritage en diamant et virtual pure - C++ - Programmation

Marsh Posté le 25-09-2013 à 11:59:56    

Salut tout le monde,
 
Soit le code suivant :

Code :
  1. class I1
  2. {
  3. public:
  4. virtual int foo() = 0;
  5. };
  6. class A : public I1
  7. {
  8. public:
  9. virtual int foo() { return 42; }
  10. };
  11. class I2 : public I1
  12. {
  13. public:
  14. virtual int bar() = 0;
  15. };
  16. class B : public I2,  public A
  17. {
  18. public:
  19. virtual int bar() { return 69; }
  20. };
  21. int main()
  22. {
  23. B b;
  24. }


 
Qui me pète une erreur de compilation disant que B est abstrait à cause de foo().
Mais foo() est défini dans A.
 
Comment lui dire de passer par A plutôt que par I2 (sans avoir à redefinir foo() dans B) ?
 
Merci d'avance  :jap:

Reply

Marsh Posté le 25-09-2013 à 11:59:56   

Reply

Marsh Posté le 25-09-2013 à 12:16:48    

Hum.
Bon si j’hérite I1 dans A et I2 en "virtual public" ca fonctionne malgre un warning du compilo.
En revanche si je redéfini foo dans B en précisant explicitement quel appel je veux faire "A::foo()" ca marche impec!

Reply

Marsh Posté le 25-09-2013 à 14:35:11    

C'est quand même ultra rare d'avoir besoin d'un héritage virtuel. Tant mieux si tu as trouvé une solution à ton problème, mais envisage quand même de revoir ton design au cas où :)


---------------
last.fm
Reply

Marsh Posté le 26-09-2013 à 20:29:27    

l'heritage simple ou multiple de classe concrete est a proscrire. Respectez plutot Liskov et faites de l'heritage privé pour factoriser le code.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed