Неоднозначность при множественном наследовании интерфейсов в 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++ (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 -очень утомительно делать, если отношения наследования классов очень сложные.Существуют ли какие-либо методы включения множественного наследования интерфейсов в С++, кроме использования виртуального наследования?

7
задан user1361349 27 April 2012 в 18:21
поделиться