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

Discussion in 'WASM.BEGINNERS' started by _Juicy, Jan 30, 2012.

  1. _Juicy

    _Juicy Active Member

    Blog Posts:
    0
    Joined:
    Aug 12, 2003
    Messages:
    1,159
    Location:
    SPb
    Есть интерфейс, скажем,
    Code (Text):
    1. struct ICanina:public IUnknown
    2. {
    3.     virtual void Bite () = 0;
    4. };
    Есть класс, реализующий IUnknown как-то так:
    Code (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

    Blog Posts:
    0
    Joined:
    Apr 3, 2011
    Messages:
    735
    не виртуальный?
     
  3. _Juicy

    _Juicy Active Member

    Blog Posts:
    0
    Joined:
    Aug 12, 2003
    Messages:
    1,159
    Location:
    SPb
    Виртуальный.
     
  4. 100gold

    100gold New Member

    Blog Posts:
    0
    Joined:
    Feb 26, 2010
    Messages:
    165
    Code (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. };
    Code (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

    Blog Posts:
    0
    Joined:
    Apr 3, 2011
    Messages:
    735
    множественное наследование или наследование только ICanina + композиция IUnknownWrap.
     
  6. _Juicy

    _Juicy Active Member

    Blog Posts:
    0
    Joined:
    Aug 12, 2003
    Messages:
    1,159
    Location:
    SPb
    100gold,
    Code (Text):
    1. ICanina : public IUnknown
    , и это нельзя изменить, однако
    все же работает. Не совсем так, как хотелось бы, но все же явно лучше, чем вообще ничего. Огромное спасибо!
     
  7. shchetinin

    shchetinin Member

    Blog Posts:
    0
    Joined:
    May 27, 2011
    Messages:
    715
    struct ICaninaWrap : virtual public бла, бла, бла.
     
  8. letopisec

    letopisec New Member

    Blog Posts:
    0
    Joined:
    Aug 8, 2004
    Messages:
    228
    Squash

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

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

    _DEN_ DEN

    Blog Posts:
    0
    Joined:
    Oct 8, 2003
    Messages:
    5,383
    Location:
    Йобастан
    Если я правильно понял, то ТС хочет множественное наследование от библиотечных интерфейсов. То есть, где нет возможности указать чтобы IUnknown наследовался виртуально. Но чтобы при этом счетчик ссылок был один на всех.