Ссылка на наследника. Как?
Есть здоровый массив ссылок на объект класса CELL - поле с ячейками.
Класс CELL имеет много потомков (BASE, BRIK ...)
Помниться(?), что можно ссылкой на родителя указывать на наследника, скажите, как.
Непонятно получилось, поэтому пример кода:
class CELL {............};
class BASE:CELL {............};
class BRIK:CELL {............};
CELL *Pole[100][100];
Pole[j] = new BRIK; //хотелось бы.
помню что можно, непомню как!
Возможно присваивание указазателя на класс-наследник указателю на базовый класс. При этом работать с экземпляром класса-наследника можно только через интерфейс (открытые функции-члены, зачастую виртуальные) базового класса. Потомки базового класса (возможно, абстрактного), замещают виртуальные функции. Так и получается объекто-ориентированная среда, демонстрирующая полиморфное поведение.
Когда в чём-то не уверен - напиши, откомпилируй и прогони тест :)
Pole[j] = (cell*)new base;
Нет, не буду ничего говорить....:)
Цитата:
Originally posted by Dr.Wisdom
Проблема решилась благодаря другим источникам (виноград форум) и была до идиотизма проста: проеобразование типов
Pole[j] = (cell*)new base;
Проблема решилась благодаря другим источникам (виноград форум) и была до идиотизма проста: проеобразование типов
Pole[j] = (cell*)new base;
Ну если проблема решилась так, то в твоем коде ошибка. Будь готов её ловить.
потому что ошибке некуда попасть! я сократил все до минимума
X)-
Цитата:
Originally posted by Dr.Wisdom
Компилятор Borland C++ 5.02, может он подвел?
потому что ошибке некуда попасть! я сократил все до минимума
X)-
Компилятор Borland C++ 5.02, может он подвел?
потому что ошибке некуда попасть! я сократил все до минимума
X)-
может все таки dynamic_cast, оно и тебе спокойней будет
Цитата:
Originally posted by honeybeer
может все таки dynamic_cast, оно и тебе спокойней будет
может все таки dynamic_cast, оно и тебе спокойней будет
Не понял я вас чего-то ребята. fellow все правильно сказал, не надо никаких дополнительных извратов - присваивай и все. И про тест, тоэ еправильно сказал, я делал так (чтоб далеко не ходить за предками и наследниками)
TCustomEdit *e;
e := new TEdit(this);
PS: А что, пятый борланд плохо держит ООП?
Цитата:
Originally posted by _kolyan
Не понял я вас чего-то ребята. fellow все правильно сказал, не надо никаких дополнительных извратов - присваивай и все. И про тест, тоэ еправильно сказал, я делал так (чтоб далеко не ходить за предками и наследниками)
TCustomEdit *e;
e := new TEdit(this);
PS: А что, пятый борланд плохо держит ООП?
Не понял я вас чего-то ребята. fellow все правильно сказал, не надо никаких дополнительных извратов - присваивай и все. И про тест, тоэ еправильно сказал, я делал так (чтоб далеко не ходить за предками и наследниками)
TCustomEdit *e;
e := new TEdit(this);
PS: А что, пятый борланд плохо держит ООП?
Вы, наверное, не потрудились прочитать все. Решение видели
Код:
Pole[j] = (cell*)new base;
Вот такое приведение указателя на потомка к базовому, если уж не подходит вариант fellow, лучше делать через см. выше
Напомню первоначальный пост:
Цитата:
Непонятно получилось, поэтому пример кода:
class CELL {............};
class BASE:CELL {............};
class BRIK:CELL {............};
CELL *Pole[100][100];
Pole[j] = new BRIK; //хотелось бы.
class CELL {............};
class BASE:CELL {............};
class BRIK:CELL {............};
CELL *Pole[100][100];
Pole[j] = new BRIK; //хотелось бы.
Обратите внимание: класс CELL является закрытым базовым классом для BASE и BRIK. А в этом случае неявное преобразование BASE в CELL и BRIK в CELL не работает.
Сделать следовало бы так:
Код:
class CELL {............};
class BASE: public CELL {............};
class BRIK: public CELL {............};
CELL *Pole[100][100];
Pole[j] = new BRIK; //вау! работает! :D
class BASE: public CELL {............};
class BRIK: public CELL {............};
CELL *Pole[100][100];
Pole[j] = new BRIK; //вау! работает! :D
Цитата:
Originally posted by fellow
Код:
class CELL {............};
class BASE: public CELL {............};
class BRIK: public CELL {............};
class BASE: public CELL {............};
class BRIK: public CELL {............};
Угу. М-гм.
Видать я многово не знаю.
Надо покопать.