[c++]попытка эмуляции queryInterface через множественное наследование

elenangel

Хочется такого:
Есть базовый класс-интерфейс IAbstractInterface без ничего (только виртуальный деструктор от него наследуются все остальные интерфейсы.
Под каждый интерфейс делается интерфейс-геттер, имеющий одну виртуальную абстрактную функцию virtual %InterfaceName% *get%InterfaceName% это можно сделать например макросом или скриптом, далее все-все геттеры наследуются вместе в один жирный общий интерфейс IInterface. Для него делается дефолтная реализация, которая делает return 0; в каждой функции для каждого типа интерфейса-геттера. Еще для каждого геттера делается класс с дефолтной реализацией return this.
Далее я беру некоторый интерфейс (ISampleSupportedInterface реализую его в классе, наследую этот класс от жирного абстрактного интерфейса и от дефолтной реализации геттера для поддерживаемого интерфейса. Теперь мой класс на getISomeInterface возвращает 0, а на getISampleSupportedInterface возвращает this.
При практической реализации этой идеи я ожидаемо получаю error: no unique final overrider. Можно ли как-то это обойти?
Вот пример реализации:

#include <iostream>
using namespace std;

class IAbstractInterface
{
public:
virtual ~IAbstractInterface = 0;
};

IAbstractInterface::~IAbstractInterface
{
}

class IAbstractActor1 : virtual public IAbstractInterface
{
public:
virtual void act1 = 0;
};

class IAbstractActor1Getter : virtual public IAbstractInterface
{
public:
virtual IAbstractActor1 *getIAbstractActor1 = 0;
};

class IAbstractActor2 : virtual public IAbstractInterface
{
public:
virtual void act2 = 0;
};

class IAbstractActor2Getter : virtual public IAbstractInterface
{
public:
virtual IAbstractActor2 *getIAbstractActor2 = 0;
};

class IInterface : virtual public IAbstractInterface,
virtual public IAbstractActor1Getter,
virtual public IAbstractActor2Getter
{

};

class BaseObject : virtual public IInterface
{
public:
IAbstractActor1 *getIAbstractActor1
{
return 0;
}

IAbstractActor2 *getIAbstractActor2
{
return 0;
}
};

class DefaultIAbstractActor1GetterImpl : virtual public IAbstractActor1, virtual public IAbstractActor1Getter
{
public:
IAbstractActor1* getIAbstractActor1
{
return this;
}
};

class Actor1 : virtual public IAbstractActor1,
virtual public DefaultIAbstractActor1GetterImpl,
virtual public BaseObject
{
public:
virtual void act1
{
cout<<"Actor1::act"<<endl;
}
};

int main(int,char**)
{
IInterface * ip = new Actor1;
IAbstractActor1 *actor1 = ip->getIAbstractActor1;
actor1->act1;
return 0;
}

ppplva

class DefaultIAbstractActor1GetterImpl : virtual public IAbstractActor1, virtual public BaseObject

elenangel

с одним интерфейсом помогло, но у меня подозрение что с 2 уже не пройдет этот финт.
Оставить комментарий
Имя или ник:
Комментарий: