访问受保护的变量 - 继承和子类的复杂情况

access protected variable - complicated situation with inheritance and sub-classes

本文关键字:子类 复杂 情况 受保护 变量 访问 继承      更新时间:2023-10-16

嗯...我正在尝试分解我的问题...有一个库,里面有一些类,几乎可以做我想要的。我无法更改库的类,因此我想派生它们并更改我需要的内容。在这种情况下,库中有一个派生类,其中包含两个子类。现在我派生了类和子类。在第二个子类中,有一个虚拟方法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 内。