Я сделал тестовый код следующим образом:Неоднозначность множественного наследования интерфейсов в C++
#include <iostream>
using namespace std;
#ifndef interface
#define interface struct
#endif
interface Base
{
virtual void funcBase() = 0;
};
interface Derived1 : public Base
{
virtual void funcDerived1() = 0;
};
interface Derived2 : public Base
{
virtual void funcDerived2() = 0;
};
interface DDerived : public Derived1, public Derived2
{
virtual void funcDDerived() = 0;
};
class Implementation : public DDerived
{
public:
void funcBase() { cout << "base" << endl; }
void funcDerived1() { cout << "derived1" << endl; }
void funcDerived2() { cout << "derived2" << endl; }
void funcDDerived() { cout << "dderived" << endl; }
};
int main()
{
DDerived *pObject = new Implementation;
pObject->funcBase();
return 0;
}
причиной, почему я написал этот код, чтобы проверить, если функцию funcBase() может быть вызвана в экземпляре DDerived или не. Мой C++ complier (Visual Studio 2010) дал мне сообщение об ошибке компиляции, когда я попытался скомпилировать этот код. На мой взгляд, в этом коде нет проблем, потому что несомненно, что функция funcBase()
будет реализована (таким образом, переопределена) в каком-то производном классе интерфейса DDerived
, потому что она является чистой виртуальной. Другими словами, любая переменная указателя типа Implementation *
должна быть связана с экземпляром класса, производящим Implentation и переопределяющим функцию funcBase()
.
Вопрос в том, почему компилятор дал мне такое сообщение об ошибке? Почему синтаксис C++ определен таким образом; то есть рассматривать этот случай как ошибку? Как я могу сделать запуск кода? Я хочу разрешить множественное наследование интерфейсов. Конечно, если я использую «виртуальную общественность» или повторно объявить функцию funcBase()
в Implementation
как
interface DDerived : public Derived1, public Derived2
{
virtual void funcBase() = 0;
virtual void funcDDerived() = 0;
};
тогда все работает без проблем.
Но я не хочу этого делать и ищу более удобный метод, поскольку виртуальное наследование может ухудшить производительность, а повторное объявление так утомительно, если отношения наследования классов очень сложны. Существуют ли какие-либо методы для включения множественного наследования интерфейсов в C++, кроме использования виртуального наследования?
Мои психические силы говорят мне, что ошибка вызывает неоднозначную функцию базового класса. –
Но это не базовый класс, это либо базовый интерфейс, либо базовая структура. –
Возможный дубликат [C++ Multiple Inheritance - почему вы не работаете?] (Http://stackoverflow.com/questions/5864466/c-multiple-inheritance-why-you-no-work) –