访问派生类的成员

Accessing members of derived classes

本文关键字:成员 派生 访问      更新时间:2023-10-16

我有一个基类和一个从它派生的类。在下面的示例中,Frame_PicBase_Pic 的派生类,我未包括其详细信息。 Frame_Pic 有成员、verticalhorizontal 和不在基类中的cornersPicture是一个接口类,基本上包含一个指向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;
}

听起来你想设置派生类的项,同时为函数提供指向基类型的指针。 执行此操作的方法是在基类中创建一个虚函数,并在派生类中实现它。

例如。。。

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

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

对成员变量的直接访问不会以多态方式运行,因此会出现错误。

你应该重新思考你编写函数的方式以及类的一般交互方式。
Reframe 可能是 Frame_Pic 的函数成员,但其功能与类Frame_Pic的任何实例无关。事实上,由于您只能确定Picture持有指向Base_pic的指针,因此它也可以持有指向不同类的实例的指针,该类派生的Base_pic不定义名为垂直、水平或角的成员。

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