![]() |
Модераторы: bsa |
![]() ![]() ![]() |
|
novice2011 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 15 Регистрация: 23.7.2011 Репутация: нет Всего: нет |
Не пойму один момент. В конструкторе: SingingWaiter(const Waiter & wt, int v = 0) : Worker(wt),Waiter(wt), Singer(wt,v) {} Worker(wt) - это Worker(const Waiter & wt), здесь используется Worker(const Worker & wk), которому по ссылке передается объект произв. класса, здесь понятно. Waiter(wt) - это Waiter(const Waiter & wt), я так понимаю, что здесь конструктор произв. класса вызывает конструктор базового класса по умолчанию, а в своем классе производит почленное копирование. Singer(wt, v) - вот здесь мне не понятно, может быть кто-нибудь объяснит? Буду очень признателен. Я так понимаю, что Singer(wt, v) - это Singer(const Waiter & wt, v), но в классе Singer нет такого конструктора. Это фрагмент кода из книги Стивена Прата. Это сообщение отредактировал(а) novice2011 - 23.7.2011, 16:54 |
|||
|
||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 20 Всего: 110 |
как же?! вот он:
Добавлено через 3 минуты и 6 секунд вот только не понятно кто такой other.. Добавлено через 4 минуты и 23 секунды очень жестокое наследование ты замутил ![]() |
|||
|
||||
novice2011 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 15 Регистрация: 23.7.2011 Репутация: нет Всего: нет |
Уважаемый boostcoder, да вместо other должен быть 0, здесь поторопился, в вышеприведенном коде исправил эту оплошность, но ведь
Singer(const Waiter & wt, v) и Singer(const Worker & wk, int v = 0) это разные конструкторы? Ведь в конструктор Singer передается объект Waiter, а не Worker. Это сообщение отредактировал(а) novice2011 - 23.7.2011, 17:02 |
|||
|
||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 20 Всего: 110 |
||||
|
||||
borisbn |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 21 Всего: 135 |
если мне не изменяет память, то ссылка (также как и указатель) на производный объект может быть преобразована к ссылке на базовый. Т.е. в данном случае происходит следующее
и это - нормально ! Это сообщение отредактировал(а) borisbn - 23.7.2011, 17:04 -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
||||
|
|||||
novice2011 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 15 Регистрация: 23.7.2011 Репутация: нет Всего: нет |
Уважаемый borisbn, но ведь у класса Singer базовый класс - это Worker, а не Waiter!
|
|||
|
||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 20 Всего: 110 |
||||
|
||||
borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 21 Всего: 135 |
novice2011, ссылка на Waiter преобразовывается к ссылке на Worker
Singer(const Worker & wk, int v = 0) <--- сюда идёт попытка "положить" Waiter'а. Он (Waiter) легко преобразовывается к Worker &
http://liveworkspace.org/code/f8ebe2ef0c09...5f057aac79d3d2e Добавлено @ 17:21 поддерживаю... не представляю жизненной ситуации, где бы такое было бы самым простым/оптимальным/надёжным/понятным решением разве что в boost ... шутка в отместку за кутю Это сообщение отредактировал(а) borisbn - 23.7.2011, 17:25 -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 20 Всего: 110 |
никогда и нигде! никогда не видел такого в бусте. буст преимущественно написан на шаблонах, по этому городить такое нет необходимости. статический полиморфизм и понятнее и быстрее работает, и позволяет выявить ошибки в compile-time. up. хотя это и не динамический. но жуть в любом случае.. Это сообщение отредактировал(а) boostcoder - 23.7.2011, 17:39 |
|||
|
||||
novice2011 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 15 Регистрация: 23.7.2011 Репутация: нет Всего: нет |
Спасибо большое, ребята, за помощь. Этот код взят из книги Прата "Язык программирования C++, лекции и упражнения".
|
|||
|
||||
abv |
|
|||
Новичок Профиль Группа: Участник Сообщений: 2 Регистрация: 2.8.2007 Репутация: нет Всего: нет |
Я бы еще добавил, что в C++ любой конструктор, который принимает единственный аргумент (может быть и второй аргумент и т. д., но все они должны иметь значения по умолчанию), преобразует значение типа аргумента в тип класса. У вас конструктор Singer(const Waiter & wt, v)) имеет все необходимые для этого условия. Компилятор ищет конструктор Singer(const Waiter & wt, v) (здесь v имеет значение по умолчанию), но его нет, а есть Singer(const Worker & wk, int v = 0), который подходит для конструирования базовой части объекта. Вот его-то и задействует конструктор Singer.
|
|||
|
||||
![]() ![]() ![]() |
Правила форума "C/C++: Для новичков" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |