Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Наследование: перевод туда и обратно


Автор: DeXPeriX 7.11.2008, 13:55
Имеется класс "балка". К балке могут быть применены различные нагрузки. Например, классы "Сила" и "Крутящий момент" наследуются от класса "Нагрузка".  У каждого из классов "Сила" и "Крутящий момент" свой метод прорисовки. 
Хочется сделать что-то типа:
for(i=0; i<кол-во_нагрузок; i++)
  нагрузка[i]->draw();
Естественно, в зависимости от типа нагрузки иногда нужно обращаться и к специфичным полям именно этого типа нагрузки. 
"Сила" и "Крутящий момент" легко приводятся к типу "Нагрузка" и пихаются в массив. А вот как их взять обратно? Если нельзя - то как лучше решить мою задачу?

Автор: Daevaorn 7.11.2008, 13:57
Цитата(DeXPeriX @  7.11.2008,  14:55 Найти цитируемый пост)
Естественно, в зависимости от типа нагрузки иногда нужно обращаться и к специфичным полям именно этого типа нагрузки. 

Вот тут концептуальная ошибка. Надо избавляться от обращения к полям. В идеале они все должны быть private.

Автор: mes 7.11.2008, 14:06
сделать метод draw виртуальным и перопределить его в наследниках. 

Автор: DeXPeriX 7.11.2008, 14:06
Они и есть private smile Обращаться пытаюсь через геттер, специфичный для силы:

Workload *tempObj;
tempObj = new Force();
//curValue = static_cast<Force>(tempObj)->getValue();
curValue = tempObj->getValue();

error: ‘class Workload’ has no member named ‘getValue’

Метод draw у всех и так переопределён

Добавлено через 12 минут и 2 секунды
В общем, получается что задача сводится к приведению типа от родителя к ребёнку. Такое в С++ возможно?

Автор: DeXPeriX 7.11.2008, 14:32
beams[curBeam]->tempObj = new Force();
//Force* tf = dynamic_cast<Force>(beams[curBeam]->tempObj);
Force* tf = (Force) beams[curBeam]->tempObj;
tmp = tf->getValue();

painter.cpp: In constructor ‘Painter::Painter()’:
painter.cpp:23: error: no matching function for call to ‘Force::Force(Workload*&)’
force.h:21: note: candidates are: Force::Force()
force.h:12: note:                 Force::Force(const Force&)

Автор: mes 7.11.2008, 14:50
Цитата(DeXPeriX @  7.11.2008,  14:06 Найти цитируемый пост)
В общем, получается что задача сводится к приведению типа от родителя к ребёнку. Такое в С++ возможно?

возможно. но зачастую есть более удачные решения..

Добавлено через 1 минуту и 18 секунд
вот набросал в другой теме примерчик.. может и Вам подойдет :
http://forum.vingrad.ru/index.php?showtopic=234230&view=findpost&p=1691597

Автор: DeXPeriX 7.11.2008, 14:52
Вот тут и спрашиваю: какое решение может быть более удачным ? smile Или как хотя бы приведение типа заставить работать....

Автор: mes 7.11.2008, 15:03
Цитата(DeXPeriX @  7.11.2008,  14:52 Найти цитируемый пост)
ли как хотя бы приведение типа заставить работать.... 

Код

   Base *  pbase = new Derived;
   Derived *p = dynamic_cast<Derived*>(pbase);


Цитата(DeXPeriX @  7.11.2008,  14:52 Найти цитируемый пост)
Вот тут и спрашиваю: какое решение может быть более удачным ?

Visitor приведенный в примере по ссылке в предыдущем посте.

Автор: DeXPeriX 7.11.2008, 15:24
Great thanks! 
Забыл метод виртуальным сделать  smile 

Автор: mes 7.11.2008, 15:57
Цитата(DeXPeriX @  7.11.2008,  15:24 Найти цитируемый пост)
забыл метод виртуальным сделать  smile 

Цитата(Крылов И.А.)

А ларчик просто открывался
 smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)