Non (pas de cette façon de toute façon)
Vous pourriez être induits en erreur par la façon dont les choses sont faites dans d'autres langages comme Java, C#, ActionScript, etc.
En C++, l'héritage multiple et la manière les classes virtuelles sont gérées et rend obsolètes les interfaces (utilisées dans d'autres langues). Dans ces autres langages, les interfaces sont utilisées pour corriger les problèmes issus du manque d'héritage multiple (bon ou mauvais, c'est un choix).
Donc, si ce que vous voulez faire est de fournir juste une interface générale avec des méthodes virtuelles fournissant des implémentations par défaut, tout mettre en œuvre dans la classe de base:
class Interface
{
virtual void myfunction() { /*...*/ } ; //default implementation
virtual void yourFunction() = 0 ; // this one HAVE TO be implemented by the user
}
class Derived
: public public Interface // dont' need another clas
{
// myfunction is implemented by base
void yourFunction(); // have to implement yourFunction
}
class DerivedB
: public public Interface // dont' need another clas
{
void myFunction();// myfunction is implemented by base but we implement it for this specific class
void yourFunction(); // have to implement yourFunction
}
Cependant, si vous voulez fournir plusieurs classes de base qui ont les mêmes interfaces, alors pensez que votre classe d'interface est la base des autres classes
// in this order
class Interface
{
virtual void myfunction() = 0;
}
class BaseA : public Interface
{
// here "virtual" is optional as if the parent is virtual, the child is virtual too
virtual void myfunction() {/*...*/}; // BaseA specific implementation
}
class BaseB : public Interface
{
virtual void myfunction() {/*...*/}; // BaseB specific implementation
}
Il y a cependant un pas-vraiment-facile à lire (lire: non recommandé) moyen de fournir une implémentation par défaut MAIS forcer l'utilisateur à e xplicitement dire s'il veut l'utiliser ou non. Il exploite le fait que même des fonctions virtuelles pures peuvent avoir des implémentations par défaut qui peuvent être appelées:
class Interface
{
virtual void myfunction() { /*...*/ } ; //default implementation
virtual void yourFunction() = 0 ; // this one HAVE TO be implemented by the user BUT provide a default implementation!
}
// in Interface.cpp
void Interface::yourFunction() // default implementation of the virtual pure function
{ /*...*/ }
// in Derived.h
class DerivedA
: public public Interface // dont' need another clas
{
// myfunction is implemented by base
void yourFunction(); // have to implement yourFunction -- DerivedA specific
}
class DerivedB
: public public Interface // dont' need another clas
{
void myFunction();// myfunction is implemented by base but we implement it for this specific class
void yourFunction() { Interface::yourFunction(); } // uses default implementation of yourFunction, hidden but existing
}
Mais ne le font pas.
peut-être si '' base' hérité de Interface' ... – djeidot
+1 pour la question claire – Chubsdad
@djeidot: '' Interface' et Derived' appartiennent à l'application, 'base' appartient à la bibliothèque. Il existe de nombreux cas où l'on souhaite ne pas avoir d'interfaces partagées avec une bibliothèque - ne réutilisez que l'implémentation pour prendre en charge les interfaces spécifiques à l'application. Caractéristique de ObjC (et le nombre d'autres langues), mais ne fonctionne pas en C++. – Dummy00001