Нет. (все равно не так)
Вы можете быть введены в заблуждение из-за того, как все делается на других языках, таких как Java, C #, ActionScript и т. Д.
В C ++ множественное наследование и способ управления виртуальными классами делают интерфейсы (используемые в других языках) устаревшими. В этих других языках интерфейсы используются для устранения проблем, возникающих из-за отсутствия множественного наследования (хорошее или плохое, это выбор).
Так что если вы хотите просто предоставить общий интерфейс с некоторыми виртуальными методами, обеспечивающими реализации по умолчанию, просто реализуйте в базовом классе:
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
}
Однако, если вы хотите предоставить несколько базовых классов с одинаковыми интерфейсами, подумайте, что ваш интерфейсный класс является базой для других классов
// 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
}
Однако существует не очень простой для чтения (читай: не рекомендуется) способ обеспечить реализацию по умолчанию, НО вынуждает пользователя явно сказать, хочет ли он его использовать или нет. Он использует тот факт, что даже чисто виртуальные функции могут иметь реализации по умолчанию, которые можно вызывать:
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
}
Но не делай этого.