【问题标题】:Accessing members of derived classes访问派生类的成员
【发布时间】:2013-12-08 22:32:40
【问题描述】:

我有一个基类和一个派生自它的类。在下面的例子中,Frame_PicBase_Pic 的派生类,我没有详细介绍。 Frame_Pic 有成员 verticalhorizontalcorners,它们不在基类中。 Picture 是一个接口类,基本上持有一个指向Base_Pic 的指针。

当我尝试在下面的 reframe 函数中为这些分配新值时,我收到一条错误消息,指出 Base_Pic 没有此类数据成员。

动作pic.p->vertical 会认为我正在访问基类。如果我将这些数据成员放在基类中,我的其余函数的编写方式就不会适应这种添加。如何分配给这些数据成员?

Picture frame(const Picture& pic, char v, char c, char h)
{
    Frame_Pic* temp = new Frame_Pic(pic.p);
    temp->vertical = v;
    temp->horizontal = h;
    temp->corners = c;
    Picture temp2(temp);
    return temp2;
}

void reframe(Picture& pic, char v, char c, char h)
{
    pic.p->vertical = v;
    pic.p->horizontal = h;
    pic.p->corners = c;
}

【问题讨论】:

  • Picture 是您的 Base_Pic 还是 Frame_Pic 类?
  • 你能发布实际的错误信息吗?并向我们​​展示如何初始化发送给函数的对象。
  • 您是否尝试通过指向 Base_Pic 的指针(或引用)访问 Frame_Pic 中的成员?
  • @NonlinearIdeas - 请参阅问题中的这一行 - “图片是一个接口类,基本上包含指向 Base_Pic 的指针。”

标签: c++


【解决方案1】:

听起来您想设置派生类的项,同时为函数提供指向基类型的指针。这样做的方法是在基类中创建一个虚函数并在派生类中实现它。

比如……

virtual void BaseClass::SetupSomeStuff(...) {
}

void DerivedClass::SetupSomeStuff(...) {
your assignments here
}

【讨论】:

    【解决方案2】:

    不要直接访问它们,而是使用您的 Picture 接口为这些成员声明 set 和 get 方法(假设两者都需要),并在派生类中实现它们。

    直接访问成员变量不会表现出多态性,因此您的错误。

    【讨论】:

      【解决方案3】:

      您应该重新考虑编写函数的方式以及类的一般交互方式。
      Reframe 可能是Frame_Pic 的函数成员,但它的功能与Frame_Pic 类的任何实例无关。事实上,既然你可以肯定地知道Picture 拥有一个指向Base_pic 的指针,那么它也可能拥有一个指向另一个类的实例的指针,该类派生了Base_pic,它没有定义名为vertical 的成员,水平或角落。

      相反,您应该像在第一个函数中所做的那样创建一个新的 Frame_pic 实例,并将 Picture 中的指针设置为该新实例。您可能还想将这两个函数标记为static(如果它们不是)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-03-05
        • 2017-09-30
        • 1970-01-01
        • 2018-04-19
        • 2018-11-27
        • 1970-01-01
        相关资源
        最近更新 更多