защищенная переменная доступа - сложная ситуация с наследованием и подклассами

0

Хм... Я пытаюсь сломать свою проблему... Существует библиотека с некоторыми классами, которые делают почти то, что я хочу. Я не могу менять классы библиотеки, поэтому хочу получить их и изменить то, что мне нужно. В этом случае в библиотеке есть производный класс с двумя подклассами. Теперь я получаю класс и подклассы. Во втором подклассе существует виртуальный метод witch, который модифицирует защищенную переменную из первого подкласса. Я хочу переопределить виртуальный метод новым виртуальным методом, который вызывает старый виртуальный wethod, а затем снова модифицирует защищенную переменную.

Почему я получаю ошибку в mySubClass2 при доступе к fResponse?

Как я могу решить свою проблему?

class libraryClass : pulic someLibraryBaseClass {
protected:
  libraryClass::librarySubClass2 lookUpFunction(int ID) {
    //some magic to find the obj
    return obj;
  }

public:
  class librarySubClass2;
  class librarySubClass1 {
  public:

    librarySubClass1(libraryClass baseObj) {
      myBaseObj = baseObj;
    }

    void someCallingFunction(int ID) {
      libraryClass::librarySubClass2 obj = myBaseObj->lookUpFunction(ID)
      obj->someHandleFunction(this)
      cout << fResponse;
    }
  protected:
    friend class librarySubClass2;
    unsigned char fResponse[200];
  private:
    libraryClass myBaseObj;
  };
  class librarySubClass2 {
  protected:
    virtual void someHandleFunction(libraryClass::librarySubClass1* obj) {
      snprintf((char*)obj->fResponse, sizeof obj->fResponse, "Some Text...\r\n"
    }
  };
};


class myDerivedClass : public libraryClass {
public:
  class mySubClass2 : public libraryClass::librarySubClass2;
  class mySubClass1 : public libraryClass::librarySubClass1 {
  protected:
    friend class mySubClass2;
  };

  class mySubClass2 : public libraryClass::librarySubClass2 {
  protected:
    virtual void someHandleFunction(libraryClass::librarySubClass1* obj) {
      libraryClass:librarySubClass2::someHandleFuntion(obj);
      snprintf((char*)obj->fResponse, sizeof obj->fResponse, "Add some more Text...\r\n"
    }
  };
};

Изменение: Забыл * в методе mySubClass2

Возможное решение:

  class mySubClass2 : public libraryClass::librarySubClass2 {
  protected:
    virtual void someHandleFunction(libraryClass::librarySubClass1* obj) {
      libraryClass:librarySubClass2::someHandleFuntion(obj);
      myDerivedClass::mySubClass1* nowMyObj = (myDerivedClass::mySubClass*) obj;
      snprintf((char*)nowMyObj->fResponse, sizeof nowMyObj->fResponse, "Add some more Text...\r\n"
    }
  };
  • 0
    Я бы начал со скобок вокруг obj->fResponse : sizeof(obj->fResponse) .
Теги:
inheritance
subclassing
derived-class
protected

3 ответа

0

Насколько я могу вам рассказать, почему вы не можете получить доступ к obj->fResponse в

void mySubClass2::someHandleFunction(libraryClass::librarySubClass1 obj) { ... }

Ну, obj имеет тип librarySubClass1 который наследует свою долю fResponse от общего предка. Однако это доля родственника mySubClass2, а не ваш, поскольку вы mySubClass2 ! Вы можете получить доступ только к fResponse объектов, которые, как известно, относятся к типу mySubClass который, как известно, не относится к объекту librarySubClass1.

Получение доступа к librarySubClass::fResponse - это как если бы у вас был свободный доступ к наследству вашего дяди от ваших бабушек и дедушек. Если у вас нет очень необычной семьи, которая свободно делится своим богатством среди всех членов семьи, у вас, вероятно, также не будет доступа к наследству вашего дяди.

  • 0
    Хм ... я думаю ты прав. Я немного поиграл и изменил метод mySubClass2. Я преобразовал библиотеку obj в mySubClass Obj. myDerivedClass :: mySubClass1 * noMyObj = (myDerivedClass :: mySubClass1 *) obj
0

Теперь я получаю класс и подклассы.

В вашем примере кода вы получаете только основной класс, а не подкласс. Вы также должны наследовать подкласс:

class libraryClass : pulic someLibraryBaseClass 
{
  class librarySubClass1 : public someLibraryBaseClass::someLibrarySubClass1 { };

  // ....
};

Но это можно сделать только в том случае, если подкласс доступен (защищен/открыт).

0

Поскольку fResponse в mySubClass2 рассматривается как защищенный, и в этот момент он находится за пределами libraryClass, он работает только с librarySubClass2, потому что он находится внутри libraryClass.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню