No. (non in quel modo in ogni caso)
Si potrebbe trarre in inganno dal modo in cui le cose vengono fatte in altri linguaggi come Java, C#, ActionScript, ecc
In C++, l'ereditarietà multipla e il modo le classi virtuali sono gestite rende obsolete le interfacce (utilizzate in altri linguaggi). In questi altri linguaggi, le interfacce vengono utilizzate per risolvere i problemi emessi dalla mancanza di ereditarietà multipla (buona o cattiva, è una scelta).
Quindi, se ciò che si vuole fare è fornire un'interfaccia generale, con alcuni metodi virtuali che forniscono implementazioni di default, basta implementare nella classe 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
}
Se, tuttavia, si desidera fornire diverse classi di base che hanno le stesse interfacce, quindi pensare che la classe interfaccia è alla base delle altre classi
// 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
}
C'è comunque una non-realtà-easy-to-read (leggi: non recommanded) modo per fornire un'implementazione di default MA costringendo l'utente a e Diciamo esplicitamente se vuole usarlo o no. Essa sfrutta il fatto che le funzioni virtuali, anche puri possono avere implementazioni predefinite che possono essere chiamati:
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
}
Ma non farlo.
forse se 'base' ereditata da' Interface' ... – djeidot
+1 per una chiara domanda – Chubsdad
@djeidot: '' Interface' e Derived' appartengono alla domanda, 'base' appartiene alla biblioteca. Esistono molti casi in cui si desidera non avere interfacce condivise con una libreria, riutilizzare solo l'implementazione per supportare le interfacce specifiche dell'applicazione. Funzionalità di ObjC (e numero di altre lingue), ma non funziona in C++. – Dummy00001