Есть интерфейс, скажем, Код (Text): struct ICanina:public IUnknown { virtual void Bite () = 0; }; Есть класс, реализующий IUnknown как-то так: Код (Text): struct IUnknownWrap:public IUnknown { HRESULT __stdcall QueryInterface(REFIID iid, void** ppv) {return 0;}; ULONG __stdcall AddRef() {return 0;}; ULONG __stdcall Release() {return 0;}; }; Я хочу создать класс ICaninaWrap:ICanina, имеющий собственную реализацию Bite () и использующий методы IUnknown от IUnknownWrap. Как его юридически оформить, чтоб компилятор понял?
Код (Text): struct ICanina : public virtual IUnknown { virtual void Bite() = 0; }; struct IUnknownWrap : public virtual IUnknown { HRESULT __stdcall QueryInterface(REFIID iid, void** ppv) {return 0;}; ULONG __stdcall AddRef() {return 0;}; ULONG __stdcall Release() {return 0;}; }; struct ICaninaWrap : public ICanina, public IUnknownWrap { void Bite() {}; }; Код (Text): template<typename T> struct IUnknownWrap : public T { HRESULT __stdcall QueryInterface(REFIID iid, void** ppv) {return 0;}; ULONG __stdcall AddRef() {return 0;}; ULONG __stdcall Release() {return 0;}; }; struct ICaninaWrap : public IUnknownWrap<ICanina> { void Bite() {}; };
100gold, Код (Text): ICanina : public IUnknown , и это нельзя изменить, однако все же работает. Не совсем так, как хотелось бы, но все же явно лучше, чем вообще ничего. Огромное спасибо!
Squash struct ICanina: virtual public IUnknown {...}; struct IUnknownWrap: virtual public IUnknown {...}; struct ICaninaWrap : public IUnknownWrap, public ICanina {...}; не, непойдет?
Если я правильно понял, то ТС хочет множественное наследование от библиотечных интерфейсов. То есть, где нет возможности указать чтобы IUnknown наследовался виртуально. Но чтобы при этом счетчик ссылок был один на всех.