2012-07-03 1 views
0

Je suis perdu. J'ai une classe Editor et une classe Controller. Les classes WorkflowEditor et WorkflowController dérivent respectivement de Editor et Controller. La classe Controller a un membre protégé Editor editor et la classe WorkflowController a un membre privé WorkflowEditor editor (avec le même nom).Membres du cours et héritage


Modifier de EitanT:
est ici un code simplifié snipped pour illustrer ce que l'OP a décrit:

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

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

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

Mon application est un module avec interface graphique. En mode flux de travail, un ruban apparaît sur Lancer et un assistant s'affiche. En cliquant sur un bouton, une méthode de la classe Controller est appelée. L'exécution se bloque car, à ce moment, Editor editor classe membre de l'objet avec le type Controller est mort. J'aimerais que le membre de la classe Editor editor soit le même que le membre de la classe WorkflowEditor editor (même nom).

En d'autres termes, si une classe A a un membre de la classe B et classe childA (dérivé de A) a un membre de la classe childB (dérivé de B), et membre de type childB et B ont même nom, ISN le membre "hérité"?

+1

Il est difficile de voir ce que votre problème est sans le code réel. Réduisez le problème à un échantillon de code minimal et publiez-le (il est difficile à partir d'une description textuelle de comprendre si vous tenez le membre par pointeur/référence/valeur, ou combien d'occurrences de chaque objet traînent) –

+0

@dlib _ ... le membre n'est-il pas hérité? _: bref, non. –

+1

@EitanT: Une réponse plus longue mais plus correcte serait "oui". –

Répondre

2

L'objet est hérité, mais pas le le même objet que celui déclaré dans la classe dérivée. Le membre de la classe dérivée est un objet distinct du membre de la classe de base, même s'ils ont le même nom. Techniquement, il cache le membre de la classe de base, le rendant accessible uniquement avec son nom qualifié, Controller::editor.

Vous pouvez réaliser ce que vous voulez avec une fonction virtuelle qui vous substituez dans la classe dérivée pour accéder à un objet qui y sont contenues:

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

Le membre de la classe dérivée masque le membre de la classe de base.

+0

Et vous pouvez accéder au membre de classe de base caché en qualifiant le nom: 'Base :: member' – tmpearce