No. (не тот путь так или иначе)
Вы могли бы ввести в заблуждение, кстати все сделано на других языках, как 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
}
Существует, однако, не-очень-легко читаемый (читай: не Рекоммендуемый) способ обеспечить реализацию по умолчанию НО принуждение пользователя к e xplicitely сказать, если он хочет использовать это или нет. Это использует тот факт, что даже чисто виртуальные функции могут иметь реализацию по умолчанию, которые могут быть названы:
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
}
Но не делайте этого.
может быть, если 'Base' унаследовал от' Interface' ... – djeidot
+1 за ясный вопрос – Chubsdad
@djeidot: '' Interface' и Derived' принадлежат к приложению 'Base' принадлежит библиотеке. Существует много случаев, когда нужно не иметь общие интерфейсы с библиотекой, - только повторно использовать реализацию для поддержки конкретных приложений. Функция ObjC (и количество других языков), но не работает на C++. – Dummy00001