0

我搞不清楚了。我有一堂课Editor和一堂课Controller。类WorkflowEditorWorkflowController派生自EditorController分别。类Controller有一个受保护的成员Editor editor,而类WorkflowController有一个私有成员WorkflowEditor editor(同名)。


从 EitanT 编辑
这是一个简化的代码,用于说明 OP 所描述的内容:

class Controller
{
    Editor editor;
    // ...
}

class WorkflowEditor : public Editor {
    // ...
};

class WorkflowController : public Controller {
    WorkflowEditor editor;
    // ...
};

我的应用程序是一个带有图形界面的模块。在工作流模式下,Launch 上会出现一个功能区,并显示一个向导。单击一个按钮时,将Controller调用类中的一个方法。执行崩溃是因为此时,Editor editor具有类型的对象的类成员Controller已死。我希望班级成员Editor editor与班级成员WorkflowEditor editor相同(同名)。

换句话说,如果一个类A有一个类的成员B并且类childA(派生自A)有一个类的成员childB(派生自B),并且类型的成员childB具有B相同的名称,那么该成员不是“继承”的吗?

4

2 回答 2

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_;
};
于 2012-07-03T17:19:42.953 回答
1

派生类中的成员隐藏了基类中的成员。

于 2012-07-03T17:02:12.863 回答