访问受保护的变量 - 继承和子类的复杂情况
access protected variable - complicated situation with inheritance and sub-classes
嗯...我正在尝试分解我的问题...有一个库,里面有一些类,几乎可以做我想要的。我无法更改库的类,因此我想派生它们并更改我需要的内容。在这种情况下,库中有一个派生类,其中包含两个子类。现在我派生了类和子类。在第二个子类中,有一个虚拟方法witch修改第一个子类中的受保护变量。我想用一个新的虚拟方法覆盖虚拟方法,该方法调用旧的虚拟 wethod 然后再次修改受保护的变量。
为什么我在访问 fResponse 时在 mySubClass2 中收到错误?
如何解决我的问题?
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...rn"
}
};
};
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...rn"
}
};
};
编辑:忘记了 * 在 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...rn"
}
};
现在我派生了类和子类。
在示例代码中,您只派生主类,而不派生子类。您还必须继承子类:
class libraryClass : pulic someLibraryBaseClass
{
class librarySubClass1 : public someLibraryBaseClass::someLibrarySubClass1 { };
// ....
};
但这只有在子类可访问(受保护/公共)的情况下才能完成。
据我所知,您想知道为什么无法访问obj->fResponse
void mySubClass2::someHandleFunction(libraryClass::librarySubClass1 obj) { ... }
嗯,obj
属于librarySubClass1
型,它从共同祖先那里继承了它的fResponse
份额。但是,那是mySubClass2
亲戚的份额,而不是你的,因为你mySubClass2
!您只能访问已知属于 mySubClass
类型的对象的fResponse
成员
librarySubClass1
对象的情况。获得librarySubClass::fResponse
就像您可以从祖父母那里免费获得叔叔的遗产一样。除非你有一个非常不寻常的家庭在所有家庭成员之间自由分享财富,否则你也可能无法获得你叔叔的遗产。
因为 mySubClass2 中的 fResponse 被视为受保护的,并且此时它在 libraryClass 之外,所以它只适用于 librarySubClass2,因为它在 libraryClass 内。
- 继承期间显示未知行为的子类
- 通过指向指针数组的指针访问子类的属性
- 从父类方法返回子类对象
- c++, 在子类中,如何在没有对象的情况下访问父类的方法?
- 将父类对象强制转换为子类的问题
- 避免在C++中重复子类定义
- 将QOpenGLWidget子类转换为使用Metal而不是OpenGL的子类是否可行?
- 如何初始化矢量的模板化子类
- C++ 继承:将子类传递给需要基类的函数并获取子类行为
- 有没有办法按值将纯抽象类的所有子类传递给 C++ 中的函数?
- 使用子类覆盖基类中定义的函数
- 子类地址等于虚拟基类地址?
- 将子类方法声明为基类的友元
- C++子类共享变量?
- 如何检查模板专用化是否是基本模板的子类?
- 仅让特定类'Fabric'构造类'Foo'及其所有子类的实例
- 使用模板参数重载C++方法:如何使其适用于模板的子类?
- 基类中的默认析构函数禁用子类中的移动构造函数(如果有成员)
- 如何在C++子类中访问父类的私有变量
- 访问受保护的变量 - 继承和子类的复杂情况