0

迷っています。クラス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;
    // ...
};

私のアプリケーションは、グラフィカル インターフェイスを備えたモジュールです。ワークフロー モードでは、起動時にリボンが表示され、ウィザードが表示されます。1 つのボタンをクリックすると、クラス内のメソッドControllerが呼び出されます。この時点で、Editor editor型を持つオブジェクトのクラス メンバーControllerが死んでいるため、実行がクラッシュします。Editor editorクラスメンバーをクラスメンバーWorkflowEditor editor(同名)と同じにしたいです。

つまり、クラスAにクラスのメンバーがありB、クラスchildA(から派生)Aにクラスのメンバー(から派生) があり、型のメンバーと同じ名前を持つ場合、メンバーは「継承」されませんか?childBBchildBB

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 に答える