Хм... Я пытаюсь сломать свою проблему... Существует библиотека с некоторыми классами, которые делают почти то, что я хочу. Я не могу менять классы библиотеки, поэтому хочу получить их и изменить то, что мне нужно. В этом случае в библиотеке есть производный класс с двумя подклассами. Теперь я получаю класс и подклассы. Во втором подклассе существует виртуальный метод 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"
}
};
Насколько я могу вам рассказать, почему вы не можете получить доступ к obj->fResponse
в
void mySubClass2::someHandleFunction(libraryClass::librarySubClass1 obj) { ... }
Ну, obj
имеет тип librarySubClass1
который наследует свою долю fResponse
от общего предка. Однако это доля родственника mySubClass2
, а не ваш, поскольку вы mySubClass2
! Вы можете получить доступ только к fResponse
объектов, которые, как известно, относятся к типу mySubClass
который, как известно, не относится к объекту librarySubClass1
.
Получение доступа к librarySubClass::fResponse
- это как если бы у вас был свободный доступ к наследству вашего дяди от ваших бабушек и дедушек. Если у вас нет очень необычной семьи, которая свободно делится своим богатством среди всех членов семьи, у вас, вероятно, также не будет доступа к наследству вашего дяди.
Теперь я получаю класс и подклассы.
В вашем примере кода вы получаете только основной класс, а не подкласс. Вы также должны наследовать подкласс:
class libraryClass : pulic someLibraryBaseClass
{
class librarySubClass1 : public someLibraryBaseClass::someLibrarySubClass1 { };
// ....
};
Но это можно сделать только в том случае, если подкласс доступен (защищен/открыт).
Поскольку fResponse в mySubClass2 рассматривается как защищенный, и в этот момент он находится за пределами libraryClass, он работает только с librarySubClass2, потому что он находится внутри libraryClass.
obj->fResponse
:sizeof(obj->fResponse)
.