2012-07-03 3 views
0

Я потерян. У меня есть класс Editor и класс Controller. Классы WorkflowEditor и WorkflowController получены от Editor и Controller соответственно. Класс Controller имеет защищенный член Editor editor и класс WorkflowController имеет частный член WorkflowEditor editor (с таким же именем).Члены класса и наследование


Редактировать от EitanT:
Вот упрощенный код пропущено, чтобы проиллюстрировать то, что ОП описал:

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 имеют такое же имя, ISN член «унаследовал»?

+1

Это трудно понять, что ваша проблема без фактического кода. Уменьшите проблему до минимального образца кода и опубликуйте его (трудно из текстового описания понять, удерживаете ли вы элемент указателем/ссылкой/значением или количеством экземпляров каждого объекта, лежащим вокруг) –

+0

@dlib _ ... не является членом унаследованного? _: короче говоря, нет. –

+1

@EitanT: Более длинный, но более правильный ответ будет «да». –

ответ

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

Член в производном классе скрывает элемент в базовом классе.

+0

И вы можете получить доступ к скрытому члену базового класса, присвоив имя: 'Base :: member' – tmpearce

Смежные вопросы