![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| sergeeff |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 46 Регистрация: 19.5.2002 Репутация: нет Всего: нет |
Идея такова (навеяна долгой работой на С):
class A { public: F1() {...} }; class B public: F1() {...} }; A *a; B *b; a = new A; b = new B; в теле программы надо реализовать некий указатель PTR, который работает примерно так if (...) PTR = a; else PRT = b; PTR->F1(); Ясно, что это необычный указатель, но большое желание такой подход реализовать Может знает кто про то как? С почтением |
|||
|
||||
| Nastya |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 27.3.2002 Где: Мариуполь Репутация: 5 Всего: 44 |
Не знаю на сколько я право, но..
1. Такой подход точно сработает если один класс базовый, а другой дочерний. Указатель типа базового класса может хранить адресс дочерноего, но тогда функцию эжелательно сделать вертуальной. 2. А если заложить преобразование типов из одного класса в другой? Надо поробовать -------------------- Что бы понять рекурсию, надо понять рекурсию "Профессионал - это человек сделавший все возможные ошибки в очень узкой области". Н.Бор |
|||
|
||||
| Step |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5151 Регистрация: 26.9.2002 Где: дурдом.UA Репутация: 5 Всего: 25 |
ptr - указатель
а потом ((CA*)ptr)=а; Соответственно ((CВ*)ptr)=b; Главное преобразование типов -------------------- - Дурак учится на своих ошибках, умный на чужих. - умные учатся у дураков |
|||
|
||||
| Paradox |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1135 Регистрация: 18.11.2002 Где: Россия Репутация: нет Всего: 1 |
А что если сделать void* a
-------------------- --- |
|||
|
||||
| Step |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5151 Регистрация: 26.9.2002 Где: дурдом.UA Репутация: 5 Всего: 25 |
именно воид с преобразование перед использованием
-------------------- - Дурак учится на своих ошибках, умный на чужих. - умные учатся у дураков |
|||
|
||||
| sergeeff |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 46 Регистрация: 19.5.2002 Репутация: нет Всего: нет |
Всем спасибо за отклики. Я сегодня почитав кое-какие умные книги (книга - источник знаний!) все реализовал.
Ближе всех оказалась Nastya. Причем функцию не просто "желательно сделать виртуальной", а просто неопходимо сделать виртуальной в базовом классе. Замечания и советы про указатель типа void * тут никак не работают. Для всеобщего сведения - обычный pointer в Windows - 4 байта, а указатель на класс - длиннее. Так что это физически просто другой объект. Ну и вот вам живой пример реализации:#include <stdio.h> class C { public: virtual void F1(void) {}; }; class A : public C { public: void F1(void) { printf("Class A : F1()\n"); } }; class B : public C { public: void F1(void) { printf("Class B : F1()\n"); } }; int main(void) { A *a; B *b; C *c; a = new A; b = new B; c = a; c->F1(); c = b; c->F1(); return (0); } Всем спасибо за советы и с Валентиновым Днем! |
|||
|
||||
| dim |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 106 Регистрация: 24.12.2002 Репутация: нет Всего: нет |
Ну это ты загнул --------------------
that's all |
|||
|
||||
| brb |
|
||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 190 Регистрация: 7.1.2003 Репутация: нет Всего: нет |
А если классы не "родственники"? Нет ни базового ни дочернего, не сыновьего и не родительского как, впрочем, и было указано изначально!
Пусть даже функция та же. По иф-элс можно, конечно, поинтер направить на разные классы, но вот вызывать
--------------------
Сказки - удивительная вещь! Самое удивительное, что в них верят только маленькие дети, которым их рассказывают мамы и мамы, которым их рассказывают подросшие дети. |
||||
|
|||||
| sergeeff |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 46 Регистрация: 19.5.2002 Репутация: нет Всего: нет |
Это видно даже в отладчике. Указатель на класс отображается не просто как адрес, а как структура, но раскрыть он ее не может. Не помню в какой книге было написано, что этот указатель не то 6, не то 8 байт.
А если классы не "родственники", то перенаправить указатель тоже не удасться (компилятор не позволит, читай Строуструпа - можно привести поинтер только к базовому типу, то есть к родительскому классу). |
||||
|
|||||
| brb |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 190 Регистрация: 7.1.2003 Репутация: нет Всего: нет |
Вот за это я и люблю С. Я всяко умнее любого компилятора! На предупреждение - согласен, а иначе это уже советская власть и плюсплюсфикация всей страны! Жаль. --------------------
Сказки - удивительная вещь! Самое удивительное, что в них верят только маленькие дети, которым их рассказывают мамы и мамы, которым их рассказывают подросшие дети. |
|||
|
||||
| Nastya |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 27.3.2002 Где: Мариуполь Репутация: 5 Всего: 44 |
Указатель на класс 4 байта и указатель на воид прекрасно приводится к укозателю на класс.
Проводим эксперемент class A{.....} void main() { A* a; cout<<sizeof(a); //4! a=(A*)malloc(sizeof(A)); a->...... delete a; } //Что и требовалось доказать -------------------- Что бы понять рекурсию, надо понять рекурсию "Профессионал - это человек сделавший все возможные ошибки в очень узкой области". Н.Бор |
|||
|
||||
| brb |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 190 Регистрация: 7.1.2003 Репутация: нет Всего: нет |
Nastya
Вы доказали, что С и С++ "родственники"
Товарищ sergeeff не понимает? --------------------
Сказки - удивительная вещь! Самое удивительное, что в них верят только маленькие дети, которым их рассказывают мамы и мамы, которым их рассказывают подросшие дети. |
|||
|
||||
| SelfDestructor |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 17 Регистрация: 27.8.2002 Репутация: нет Всего: нет |
Для этой цели иногда приходится специально добавлять абстрактный базовый класс для классов A и B:
class C { public: virtual void F1(void) = 0; }; А воидовые указатили это моветон =))) |
|||
|
||||
| dim |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 106 Регистрация: 24.12.2002 Репутация: нет Всего: нет |
Что на это можно сказать - только одно: учи матчасть. А то так могут появится указатели и в 7 и 9 байт. --------------------
that's all |
|||
|
||||
| Fantasist |
|
||||||||||
|
Лентяй ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1517 Регистрация: 24.3.2002 Репутация: 4 Всего: 41 |
Вполне можно воспользоваться преобразованием типов. В стиле С:
В стиле С++:
Но оба варианта гораздо хуже виртуальных функций. Про преобразования типов и возникающие при этом опасности можно расказывать и обсуждать долго.
Это точно. В отладчике показывается структура на которую указывает указатель, а не структура самого указателя. -------------------- Волны гасят ветер... |
||||||||||
|
|||||||||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |