Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Ссылка на наследника. Как?

8.4K
08 июля 2005 года
Dr.Wisdom
9 / / 06.01.2005
Проблема следующая:
Есть здоровый массив ссылок на объект класса CELL - поле с ячейками.
Класс CELL имеет много потомков (BASE, BRIK ...)
Помниться(?), что можно ссылкой на родителя указывать на наследника, скажите, как.

Непонятно получилось, поэтому пример кода:
class CELL {............};
class BASE:CELL {............};
class BRIK:CELL {............};

CELL *Pole[100][100];

Pole[j] = new BRIK; //хотелось бы.

помню что можно, непомню как!
310
09 июля 2005 года
fellow
853 / / 17.03.2003
Именно так. Написано верно.

Возможно присваивание указазателя на класс-наследник указателю на базовый класс. При этом работать с экземпляром класса-наследника можно только через интерфейс (открытые функции-члены, зачастую виртуальные) базового класса. Потомки базового класса (возможно, абстрактного), замещают виртуальные функции. Так и получается объекто-ориентированная среда, демонстрирующая полиморфное поведение.

Когда в чём-то не уверен - напиши, откомпилируй и прогони тест :)
8.4K
09 июля 2005 года
Dr.Wisdom
9 / / 06.01.2005
Проблема решилась благодаря другим источникам (виноград форум) и была до идиотизма проста: проеобразование типов

Pole[j] = (cell*)new base;
310
09 июля 2005 года
fellow
853 / / 17.03.2003
Э-э-э......

Нет, не буду ничего говорить....:)
3
09 июля 2005 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by Dr.Wisdom
Проблема решилась благодаря другим источникам (виноград форум) и была до идиотизма проста: проеобразование типов

Pole[j] = (cell*)new base;



Ну если проблема решилась так, то в твоем коде ошибка. Будь готов её ловить.

8.4K
13 июля 2005 года
Dr.Wisdom
9 / / 06.01.2005
Компилятор Borland C++ 5.02, может он подвел?
потому что ошибке некуда попасть! я сократил все до минимума
X)-
585
14 июля 2005 года
honeybeer
297 / / 06.09.2004
Цитата:
Originally posted by Dr.Wisdom
Компилятор Borland C++ 5.02, может он подвел?
потому что ошибке некуда попасть! я сократил все до минимума
X)-



может все таки dynamic_cast, оно и тебе спокойней будет

362
14 июля 2005 года
_kolyan
339 / / 03.12.2002
Цитата:
Originally posted by honeybeer
может все таки dynamic_cast, оно и тебе спокойней будет



Не понял я вас чего-то ребята. fellow все правильно сказал, не надо никаких дополнительных извратов - присваивай и все. И про тест, тоэ еправильно сказал, я делал так (чтоб далеко не ходить за предками и наследниками)

TCustomEdit *e;
e := new TEdit(this);

PS: А что, пятый борланд плохо держит ООП?

585
14 июля 2005 года
honeybeer
297 / / 06.09.2004
Цитата:
Originally posted by _kolyan
Не понял я вас чего-то ребята. fellow все правильно сказал, не надо никаких дополнительных извратов - присваивай и все. И про тест, тоэ еправильно сказал, я делал так (чтоб далеко не ходить за предками и наследниками)

TCustomEdit *e;
e := new TEdit(this);

PS: А что, пятый борланд плохо держит ООП?



Вы, наверное, не потрудились прочитать все. Решение видели

 
Код:
Pole[j] = (cell*)new base;
?
Вот такое приведение указателя на потомка к базовому, если уж не подходит вариант fellow, лучше делать через см. выше
310
14 июля 2005 года
fellow
853 / / 17.03.2003
Я надеялся, что автор темы сам разберётся в проблеме. Видимо, не судьба :)

Напомню первоначальный пост:
Цитата:
Непонятно получилось, поэтому пример кода:
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
8.4K
16 июля 2005 года
Dr.Wisdom
9 / / 06.01.2005
Цитата:
Originally posted by fellow
 
Код:
class CELL {............};
class BASE: public CELL {............};
class BRIK: public CELL {............};


Угу. М-гм.
Видать я многово не знаю.
Надо покопать.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог