Я сделал тестовый код следующим образом:
#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++ (Visual Studio 2010 )выдал мне сообщение об ошибке компиляции, когда я попытался скомпилировать этот код. На мой взгляд, в этом коде нет проблем, потому что функция funcBase()
будет реализована (, таким образом, переопределена )в каком-то производном классе интерфейса DDerived
, потому что он чисто виртуальный. Другими словами, любая переменная-указатель типа Implementation *
должна быть связана с экземпляром класса, производного от внедрения и переопределяющего функцию funcBase()
.
Мой вопрос: почему компилятор выдает такое сообщение об ошибке? Почему синтаксис C++ определен именно так; считать этот случай ошибкой? Как я могу заставить код работать? Я хочу разрешить множественное наследование интерфейсов. Конечно, если я использую «виртуальный публичный доступ» или повторно -объявляю функцию funcBase()
в Implementation
, например
interface DDerived : public Derived1, public Derived2
{
virtual void funcBase() = 0;
virtual void funcDDerived() = 0;
};
, тогда все работает без проблем.
Но я не хочу этого делать и ищу более удобный способ, т.к. виртуальное наследование может ухудшить производительность, а объявление re -очень утомительно делать, если отношения наследования классов очень сложные.Существуют ли какие-либо методы включения множественного наследования интерфейсов в С++, кроме использования виртуального наследования?