3

Dites que nous avons une classe héritant de deux classes de base (héritage multiple). Base class A est abstrait, déclarant une fonction virtuelle pure foo, l'autre base class B déclare et implémente une fonction foo de la même signature."importer" une définition d'une fonction d'une classe de base pour implémenter une interface abstraite (héritage multiple en C++)

struct A 
{ 
    virtual void foo(int i) = 0; 
}; 

struct B 
{ 
    virtual void foo(int i) {} 
}; 

struct C : public A, public B {}; 

Je veux utiliser la mise en œuvre de foo de la base class B dans mon dérivé class C. Cependant, si je n'implémente pas la fonction foo une seconde fois dans mon class C dérivé, je ne peux en instancier aucun objet (il reste abstrait). L'héritage virtuel n'aide pas ici comme prévu (class A et class B n'ont aucune classe de base commune).

Je me demande s'il existe un moyen d '«importer» l'implémentation de foo de class B dans class C afin de ne pas avoir à répéter le même code.

L'exemple ci-dessus est bien entendu artificiel. La raison pour laquelle je veux implémenter foo dans class B est que je veux dériver class D : public B et utiliser l'implémentation de class B de foo. Je sais que l'héritage n'est pas (principalement) destiné à la réutilisation du code, mais j'aimerais quand même l'utiliser de cette façon.

Répondre

2

En java, votre exemple de code fonctionne. En C++ ce n'est pas le cas. Une différence subtile entre ces langues.

Votre meilleure option en C++ est de définir C :: foo() en transmettant à B :: foo():

struct C : public A, public B 
{ 
    virtual void foo(int i) { B::foo(i); } 
}; 
+0

qui sonne comme une option viable au moins, merci! – kynan