![]() |
|
|
![]()
|
|
| Нитонисе |
|
||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 917 Регистрация: 5.11.2009 Репутация: 2 Всего: 2 |
Есть класс А, у которого имеются потомки класс В и класс C.
Есть также класс D, одна из операций которого выглядит так
то есть класс D должен работать с наследниками класса A. Теперь пишу такой код
Компилятор ругается на последнюю строчку
как мне научить класс D работать с разными потомками класса А? Это сообщение отредактировал(а) Нитонисе - 2.11.2010, 19:20 |
||||||
|
|||||||
| baldina |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 1 Всего: 101 |
дело в том, что B и C являются А, но А не является ни B, ни C (Ту134 - самолет, но самолет - не обязательно Ту134)
в чем полиморфизм? в том, что принимая аргументом A* и вызывая виртуальную функцию, будут работать методы B или C, в зависимости от типа.
так:
|
||||
|
|||||
| Нитонисе |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 917 Регистрация: 5.11.2009 Репутация: 2 Всего: 2 |
baldina, так получается что работает метод, реализованный в классах В и С. Это не совсем то, что мне нужно. Мне нужно чтобы работал метод, реализованный в D.
Добавлено @ 19:45 То есть изначально метод класса D не знает какой именно потомок класса А будет его аргументом. Действует позднее связывание, тип аргумента определяется по факту переданного в метод указателя. Это сообщение отредактировал(а) Нитонисе - 2.11.2010, 19:46 |
|||
|
||||
| Artemon |
|
||||
|
а ты мне нравишься ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1771 Регистрация: 24.2.2004 Где: Челябинск Репутация: 7 Всего: 20 |
Класс D вообще никак не участвует в наследовании, поэтому требование просто не корректное.
Пример который тебе показали, на 100% соответствует этому -------------------- Контроль топлива на топливозаправщиках, мониторинг автотранспорта, расчет зарплаты водителей www.rscat.ru |
||||
|
|||||
| Нитонисе |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 917 Регистрация: 5.11.2009 Репутация: 2 Всего: 2 |
Пример-то верный, только он немного не в тему. Мне надо чтобы метод D::method(A*) работал с собственными данными класса D, а по типу своего аргумента определял как именно с ними нужно работать. Я так понял у меня изначально постановка задачи неверная. Нужно сделать по примеру, который расписал baldina, а в реализации метода D::method(A*) выполнять проверку типа аргумента. Если указатель на B - то один набор операций, если это указатель на С - второй набор операций. |
|||
|
||||
| Artemon |
|
|||
|
а ты мне нравишься ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1771 Регистрация: 24.2.2004 Где: Челябинск Репутация: 7 Всего: 20 |
Не очень хорошая идея делать проверки. Зачем вам тогда полиморфизм ?
Вам нужно чтобы все производные классы (в вашем случае A и B) умели возвращать данные через одинаковые методы, тогда вы сможете сделать следующее (немного переделал пример для понятности):
Это сообщение отредактировал(а) Artemon - 2.11.2010, 20:58 -------------------- Контроль топлива на топливозаправщиках, мониторинг автотранспорта, расчет зарплаты водителей www.rscat.ru |
|||
|
||||
| Нитонисе |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 917 Регистрация: 5.11.2009 Репутация: 2 Всего: 2 |
Не, тут дело в том, что проблемы вызвать нужную функцию из семейства А,В,С нет. Есть проблема правильно выполнить метод D::(A*). То есть в зависимости от того, какой фактический указатель передается в метод, я выполняю разные операции.
|
|||
|
||||
| Artemon |
|
|||
|
а ты мне нравишься ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1771 Регистрация: 24.2.2004 Где: Челябинск Репутация: 7 Всего: 20 |
Зачем тогда вообще нужны классы A и B
Передавайте в метод класса D элемент из перечисления enum EActions { eAction1 = 0, eAction2, eAction3 }; void method (EActions a) { switch(a) { case eAction1: data += 1; break; case eAction2: data += 2; break; } } -------------------- Контроль топлива на топливозаправщиках, мониторинг автотранспорта, расчет зарплаты водителей www.rscat.ru |
|||
|
||||
| Нитонисе |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 917 Регистрация: 5.11.2009 Репутация: 2 Всего: 2 |
||||
|
||||
| Artemon |
|
|||
|
а ты мне нравишься ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1771 Регистрация: 24.2.2004 Где: Челябинск Репутация: 7 Всего: 20 |
Все уже сказано выше, лично мне добавить нечего. -------------------- Контроль топлива на топливозаправщиках, мониторинг автотранспорта, расчет зарплаты водителей www.rscat.ru |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 6 Всего: 250 |
не все http://liveworkspace.org/code/ca23ab383de6...54a82098539f3d6 Это сообщение отредактировал(а) mes - 3.11.2010, 10:51 |
|||
|
||||
| baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 1 Всего: 101 |
mes, пример хороший и правильный. к сожалению, он вряд ли поможет ТС, а может и навредит, потому что
где B и C имеют общего предка, скорее всего следствие ошибок проектирования. те редкие случаи, когда это действительно нужно, возникают на более высоком уровне абстракции, когда про полиморфизм в С++ ясно все и понятны его недостатки. если я неправ, хотелось бы не технический, а жизненный пример |
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 48 Всего: 223 |
Перенесите разные части того, что нужно исполнять в классе D в классы B и C (в виде виртуальной функции, описанной в классе A), и вызывайте ее из D::method(A*)
|
|||
|
||||
| Нитонисе |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 917 Регистрация: 5.11.2009 Репутация: 2 Всего: 2 |
Это было бы неудобно, так как метод соотносится с классом D и работает с его данными. Работать данными метода D в классах В и С - как-то не корректно. |
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 48 Всего: 223 |
||||
|
||||
![]()
|
| Правила форума "С++ Builder" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C++ Builder | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |