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

时间:2013-12-29 15:16:23

标签: c++ inheritance protected derived-class subclassing

嗯......我试图解决我的问题...... 有一个库,其中一些类几乎可以满足我的需要。我不能改变库的类,所以我想得到它们并改变我需要的东西。 在这种情况下,库中有一个带有两个子类的派生类。现在我派生了类和子类。 在第二个子类中,有一个虚拟方法可以修改来自第一个子类的受保护变量。 我想用一个新的虚方法覆盖虚方法,该方法调用旧的虚拟方法,然后再次修改受保护的变量。

为什么我在访问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...\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"
    }
  };

3 个答案:

答案 0 :(得分:0)

  

现在我派生了类和子类。

在您的示例代码中,您只是派生主类而不是子类。你还必须继承子类:

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

  // ....
};

但只有在子类可访问(protected / public)时才能这样做。

答案 1 :(得分:0)

据我所知,你想知道为什么你无法访问<{p>}中的obj->fResponse

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

好吧,obj的类型为librarySubClass1,它从共同的祖先继承了fResponse的份额。但是,这是mySubClass2的亲戚的份额,而不是你的mySubClass2!您只能访问已知类型为fResponse的{​​{1}}对象成员,而mySubClass对象实际上并非如此。

访问librarySubClass1就好像您可以从祖父母那里免费获得叔叔的遗产一样。除非你有一个非常不寻常的家庭在所有家庭成员之间自由分享财富,否则你可能无法获得叔叔的遗产。

答案 2 :(得分:0)

因为mySubClass2中的fResponse被视为受保护,并且此时它在libraryClass之外,它只能在librarySubClass2上工作,因为它位于libraryClass中。