![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| Gunslinger |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 842 Регистрация: 30.12.2006 Где: Астрахань Репутация: 1 Всего: 3 |
Это вроде композицией называется. На примере сериализации. От этого класса есть какое-то количество наследников, которые все нужно сериализовать. Ошибочно реализовывать метод сериализации для каждого наследника, вместо этого создается один метод сериализации, но с аргументом не какого-либо наследника, а их родителя. Тогда в такой метод можно передавать любого наследника. Вопрос: в таком случае доступ к свойствам и методам наследника будет? Ведь наследник - это свойства\методы родителя + свои, наследник передается через аргумент с типом его родителя, то есть, свойства\методы наследника не доступны.. Или я ошибаюсь?
|
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
нет, не это. имхо, или не так описали, или не так поняли.
либо базовый класс должен обладать необходимым интерфейсом, либо нужно привести базу к типу наследника. |
|||
|
||||
| Gunslinger |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 842 Регистрация: 30.12.2006 Где: Астрахань Репутация: 1 Всего: 3 |
ага, писал по памяти. Сейчас найти ту информацию не могу. Нечто вроде:
Вопрос: в таком варианте добавочные свойства\методы наследников Dog, Cat,.., N не доступны, раз они передаются по типу Pet? И если не доступны, как сделать так, чтобы были доступны и при этом сохранить такой тип аргумента, чтобы не реализовывать метод для каждого наследника? |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
"обычный" полиморфизм двойная диспатчеризация (она же паттерн визитер) dynamic_cast |
|||
|
||||
| KelTron |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 745 Регистрация: 8.10.2006 Где: Красноярск Репутация: нет Всего: 38 |
Так если у тебя логика функции отличается для разных типов объектов, то так и надо сделать для каждого типа свою функцию.
Ссылка на базовый класс имеет смысл только тогда, когда со всеми потомками можно работать как с базовым классом, т.е. требуется только унаследованный интерфейс. -------------------- Тысячами незримых нитей обвивает тебя Закон. Разрубишь одну - преступник. Десять - смертник. Все - Бог. Эвенгар Салладорский, основатель Школы Тьмы. |
|||
|
||||
| Gunslinger |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 842 Регистрация: 30.12.2006 Где: Астрахань Репутация: 1 Всего: 3 |
про обычный полиморфизм не понял, как это возможно, может быть вы имеете ввиду виртуализацию? по остальному - гуглю.
Само собой логика одна и та же, поэтому плодить метод бессмысленно, а как правильно - не знаю. |
||||
|
|||||
| mes |
|
||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
тогда тоже в гугль (или сразу в книжку) - динамический полиморфизм
ну для начала приведите пример более точно отражающий вашу задачу, чем пример выше. |
||||
|
|||||
| Gunslinger |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 842 Регистрация: 30.12.2006 Где: Астрахань Репутация: 1 Всего: 3 |
Я про виртуальные функции и говорил.
Пример привести не могу, т.к. конкретной задачи нет. Интересовало вот что: если мы передаем в функцию с параметром типа Родитель аргумент с типом ПотомокЭтогоРодителя, то в функции у нас будет доступ к свойствам и методам потомка или только к унаследованным от Родителя?
Это сообщение отредактировал(а) Gunslinger - 19.11.2009, 09:36 |
||||
|
|||||
| KelTron |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 745 Регистрация: 8.10.2006 Где: Красноярск Репутация: нет Всего: 38 |
Только к унаследованным, хотя можно сделать явное приведение, но тогда полностью теряется смысл в ссылке на базовый класс. -------------------- Тысячами незримых нитей обвивает тебя Закон. Разрубишь одну - преступник. Десять - смертник. Все - Бог. Эвенгар Салладорский, основатель Школы Тьмы. |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
ну вот Вам тогда общие примеры, может поможет наглядно разобраться: http://forum.vingrad.ru/index.php?showtopi...t&p=1715082 http://forum.vingrad.ru/index.php?showtopi...t&p=1692823 (ну вот пришлось вместо Вас поиск пользовать... Это сообщение отредактировал(а) mes - 19.11.2009, 14:32 |
|||
|
||||
| Gunslinger |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 842 Регистрация: 30.12.2006 Где: Астрахань Репутация: 1 Всего: 3 |
mes, извините, что отнял столько времени с поиском - я в гугле искал, а по форуму поискать не додумался.
Читаю ссылки, что вы дали. Понял, что в понимании низкого уровня пробел. Пока другой вопрос: про указатели и адреса памяти. Какой смысл писать тип указателя, тем более структуры или класса? Указатель же хранит адрес ячейки памяти, а структура\класс со своими полями\методами занимает больше, чем одна ячейка... Или эта инфа для компилятора? з.ы. под ячейкой я понимаю 1 байт. Это сообщение отредактировал(а) Gunslinger - 19.11.2009, 16:36 |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
ну искать не долго то было.. я то знал что ищу.. замечание было направлено на то, чтоб обратить внимание , что многие темы поднимались и разбирались уже не раз и даже с примерами. Добавлено через 5 минут и 29 секунд Да.. но не только для компилятора, но и для удобства программиста. Это сообщение отредактировал(а) mes - 19.11.2009, 16:56 |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
нет указатель нечто больше.. адрес то можно хранить и в void *, но тогда статическая информация о типе (в частности об интерфейсе доступа к объекту) будет утеряна. Ну взять хотя бы инкрементацию указателя.. Она изменяет его значение не на один байт, а на размер объекта типа. P.S. не забывайте про правило форума :один вопрос - одна тема. Это сообщение отредактировал(а) mes - 19.11.2009, 17:13 |
|||
|
||||
| Gunslinger |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 842 Регистрация: 30.12.2006 Где: Астрахань Репутация: 1 Всего: 3 |
Понял, создал отдельную: "Механика работы указателей" -- http://forum.vingrad.ru/forum/act-ST/f-92/...0/unread-1.html Это сообщение отредактировал(а) Gunslinger - 20.11.2009, 10:37 |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
Тип это некая абстракция языка позволяющая определить поведение объектов и взаимодействие между ними.
C++ обладает статической типизацией, т.е. вся информация о типах существует только в режиме компиляции. Типы бывают встроенными (int, double...) и пользовательскими (struct, class, union). Тип переменной проассоциирован с ней на протяжении всей ее видимости. т.е. программист пишет int i; и в дальнейшем везде где используется эта i компилятор знает, что она int. Благодаря типизации возможна перегрузка функций. Т.е. вызывая какую нибудь функцию с аргументами компилятор ищет из всех функций с одинаковым именем, наиболее подходящую. Польза от перегрузки очевидная:
В C++ перегрузка существует не только для функций, но и для операторов. т.е. в выражении a+b; выберется к примеру op+<int, int>() или op+<double,double>() Однако одной перегрузки нeдостаточно для удобной работы, так как нам пришлось бы определять кучу одинаковых функций для всех нужных типов. Для решения этой проблемы в c++ введено приведение типов. (Оно бывает явное и неявное, а также делится по уровням продвижение, стандарное и пользовательское преобразования). теперь для выражения char_+int_ не нужно реализовывать отдельный плюс, а можно привести к виду int_ + int_. То же касается и пользовательских типов, для которых программист может определить нужные преобразования. Также благодаря знаниям o типе известен и размер объекта, и нам не нужно следить вручную. По типам вроде бы все, пойдем дальше.. Чтоб работать с объектом в С++ существуют временный объект, переменная, ссылка, и указатель. Каждая это представление (еще одно помимо типа) некой абстракции для пользования объектом. Указатель это такой объект, который хранит адрес другого объекта или 0, позволяет итерацию (размер шага которой определяется типом указателя), а также предоставляет доступ путем разъименования или через operator->() Ссылка это сущность (не объект) которая проассоциирована с адресом объекта и предоставляет к нему доступ посредством operator.() Ну кажется все.. Надеюсь объяснение не сильно отличается от истины |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |