我迷路了。我有一个班级Editor
和一个班级Controller
。类WorkflowEditor
和WorkflowController
分别来自Editor
和Controller
。班级Controller
有受保护的成员Editor editor
,班级WorkflowController
有私人成员WorkflowEditor editor
(同名)。
从EitanT编辑:
这是一个简化的代码,用于说明OP所描述的内容:
class Controller
{
Editor editor;
// ...
}
class WorkflowEditor : public Editor {
// ...
};
class WorkflowController : public Controller {
WorkflowEditor editor;
// ...
};
我的应用程序是一个带图形界面的模块。在工作流程模式下,启动时会出现一个功能区,并显示一个向导。单击一个按钮,将调用类Controller
中的方法。执行崩溃,因为此时,类型为Editor editor
的对象的Controller
类成员已经死亡。我希望班级成员Editor editor
与班级成员WorkflowEditor editor
(同名)相同。
换句话说,如果一个班级A
有一个班级B
,而班级childA
(派生自A
)的班级成员childB
}(派生自B
),类型childB
和B
的成员具有相同的名称,是不是“继承”的成员?
答案 0 :(得分:2)
该对象是继承的,但不是与派生类中声明的对象相同的对象。派生类成员是基类成员的单独对象,即使它们具有相同的名称。从技术上讲,它隐藏基类成员,只能使用其限定名称Controller::editor
进行访问。
您可以使用虚拟函数实现所需,您可以在派生类中覆盖该函数以访问其中包含的对象:
class Controller {
public:
// No data members, just an abstract interface
// Access a data member of the derived class
virtual Editor & editor() = 0;
virtual ~Controller() {}
};
class WorkflowController : public Controller {
public:
WorkflowEditor & editor() {return editor_;}
private:
// The object itself - accessible as its true type here, or
// as its abstract type via the abstract interface.
WorkflowEditor editor_;
};
答案 1 :(得分:1)
派生类中的成员隐藏基类中的成员。