C++/классы/наследование

Тема в разделе "WASM.BEGINNERS", создана пользователем _Juicy, 30 янв 2012.

  1. _Juicy

    _Juicy Active Member

    Публикаций:
    0
    Регистрация:
    12 авг 2003
    Сообщения:
    1.159
    Адрес:
    SPb
    Есть интерфейс, скажем,
    Код (Text):
    1. struct ICanina:public IUnknown
    2. {
    3.     virtual void Bite () = 0;
    4. };
    Есть класс, реализующий IUnknown как-то так:
    Код (Text):
    1. struct IUnknownWrap:public IUnknown
    2. {
    3.     HRESULT __stdcall QueryInterface(REFIID iid, void** ppv) {return 0;};
    4.     ULONG __stdcall AddRef() {return 0;};
    5.     ULONG __stdcall Release() {return 0;};
    6. };
    Я хочу создать класс ICaninaWrap:ICanina, имеющий собственную реализацию Bite () и использующий методы IUnknown от IUnknownWrap.
    Как его юридически оформить, чтоб компилятор понял?
     
  2. h0t

    h0t Member

    Публикаций:
    0
    Регистрация:
    3 апр 2011
    Сообщения:
    735
    не виртуальный?
     
  3. _Juicy

    _Juicy Active Member

    Публикаций:
    0
    Регистрация:
    12 авг 2003
    Сообщения:
    1.159
    Адрес:
    SPb
    Виртуальный.
     
  4. 100gold

    100gold New Member

    Публикаций:
    0
    Регистрация:
    26 фев 2010
    Сообщения:
    165
    Код (Text):
    1. struct ICanina : public virtual IUnknown
    2. {
    3.     virtual void Bite() = 0;
    4. };
    5. struct IUnknownWrap : public virtual IUnknown
    6. {
    7.     HRESULT __stdcall QueryInterface(REFIID iid, void** ppv) {return 0;};
    8.     ULONG __stdcall AddRef() {return 0;};
    9.     ULONG __stdcall Release() {return 0;};
    10. };
    11. struct ICaninaWrap : public ICanina, public IUnknownWrap
    12. {
    13.     void Bite() {};
    14. };
    Код (Text):
    1. template<typename T>
    2. struct IUnknownWrap : public T
    3. {
    4.     HRESULT __stdcall QueryInterface(REFIID iid, void** ppv) {return 0;};
    5.     ULONG __stdcall AddRef() {return 0;};
    6.     ULONG __stdcall Release() {return 0;};
    7. };
    8. struct ICaninaWrap : public IUnknownWrap<ICanina>
    9. {
    10.     void Bite() {};
    11. };
     
  5. h0t

    h0t Member

    Публикаций:
    0
    Регистрация:
    3 апр 2011
    Сообщения:
    735
    множественное наследование или наследование только ICanina + композиция IUnknownWrap.
     
  6. _Juicy

    _Juicy Active Member

    Публикаций:
    0
    Регистрация:
    12 авг 2003
    Сообщения:
    1.159
    Адрес:
    SPb
    100gold,
    Код (Text):
    1. ICanina : public IUnknown
    , и это нельзя изменить, однако
    все же работает. Не совсем так, как хотелось бы, но все же явно лучше, чем вообще ничего. Огромное спасибо!
     
  7. shchetinin

    shchetinin Member

    Публикаций:
    0
    Регистрация:
    27 май 2011
    Сообщения:
    715
    struct ICaninaWrap : virtual public бла, бла, бла.
     
  8. letopisec

    letopisec New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2004
    Сообщения:
    228
    Squash

    struct ICanina: virtual public IUnknown {...};
    struct IUnknownWrap: virtual public IUnknown {...};
    struct ICaninaWrap : public IUnknownWrap, public ICanina {...};

    не, непойдет?
     
  9. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Если я правильно понял, то ТС хочет множественное наследование от библиотечных интерфейсов. То есть, где нет возможности указать чтобы IUnknown наследовался виртуально. Но чтобы при этом счетчик ссылок был один на всех.