|
Модераторы: bsa |
|
шарлотта |
|
||||
Шустрый Профиль Группа: Участник Сообщений: 55 Регистрация: 1.3.2017 Репутация: нет Всего: нет |
Здравствуйте!
Требуется реализовать виртуальную функцию сложения в классе Array, переопределив ее в производном классе Fraction
Не могу понять, как это сделать. Ведь если написать так, то это будет перегрузка, а не переопределение виртуального метода.
Буду очень благодарна за помощь! Это сообщение отредактировал(а) шарлотта - 9.5.2017, 22:12 |
||||
|
|||||
vpf |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 119 Регистрация: 14.11.2016 Где: Moscow Репутация: нет Всего: нет |
виртуальный метод не должен иметь тела в классе Array, только объявление.
Поэтому в классе Array вы даете только объявление функции А в классе Fraction помещаете ее тело, то есть то, что вы дали в первом блоке кода. |
|||
|
||||
tzirechnoy |
|
||||
Эксперт Профиль Группа: Завсегдатай Сообщений: 1173 Регистрация: 30.1.2009 Репутация: -1 Всего: 16 |
Нет, это Вы с pure virtual перепутали, да и то в довольно старом понимании.
Очень сложно понимать русскую терминологию, которой я дажэ не знаю где искать определения, но если перегрузка -- это overload, а переопределение -- это override, то Во-первых это всегда будет overload of an operator +, то есть без перегрузки тут никак не обойдётся. Во-вторых, чтобы что-то override надо чтобы тот, кого override и тот, кто override находились в базовом и унаследованном классе. Собственно, для того, чтобы это наывалось override это почти единственное требование -- ну, кроме совпадения имени. В-третьих, чтобы override был virtual -- нужно, чтобы в базовом классе этот оператор был объявлен virtual, а во-вторых -- чтобы сигнатуры функцый достаточно совпадали (допускается смена параметров-ссылок и указателей на ссылки на ковариантные классы). |
||||
|
|||||
шарлотта |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 55 Регистрация: 1.3.2017 Репутация: нет Всего: нет |
В базовом и производном находятся, virtual объявлен. Проблема возникает как раз с сигнатурой функции. Не очень понимаю, как поменять типы переданных параметров и возвращаемого значения.
Попыталась сделать так, чтобы принимал указатели.
Изменяет вызвавший объект. Буду очень благодарна за помощь! Это сообщение отредактировал(а) шарлотта - 9.5.2017, 13:10 |
|||
|
||||
tzirechnoy |
|
|||
Эксперт Профиль Группа: Завсегдатай Сообщений: 1173 Регистрация: 30.1.2009 Репутация: -1 Всего: 16 |
1) Вообще, примерно всем любопытствующим было бы сильно проще, если бы Вы приводили минимальный компилирующийся пример. Одновременно мы могли бы его сами запустить, и нам не пришлось бы догадываться что у вас там за декларацыи, не забыт ли где virtual и пр.
2) Первый мой ответ был так сделать в динамической памяти, new(Array), но этот ответ очевидно дурацкий, поскольку память утекать будет. А, собственно... А куда это всё из этого виртуального оператора присваиваться будет? Просто если это будет присваиваться всегда Array (включая ссылки на Array), то оба оператора и должны возвращать Array, а не Fraction. А если это будет присваиваться указателю на Array, то можно возвращать указатели на Array/Fraction, смело размещая их в динамической памяти, и рассчитывая что пользователь потом их удалит. Собственно, дайте более полную задачу, да. |
|||
|
||||
awesome |
|
||||||
Шустрый Профиль Группа: Участник Сообщений: 58 Регистрация: 20.10.2010 Репутация: нет Всего: нет |
Вообщем читайте про двойную диспетчеризацию, так как полиморфные бинарные операторы попадают под этот случай. Если вкратце, то вам нужно определить неполиморфный дескриптор, который реализует операции и содержит полиморфные типы, делегируя им выполнение операции. |
||||||
|
|||||||
volatile |
|
|||
Эксперт Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 16 Всего: 85 |
Здесь не сказано реализовать оператор сложения, а всего лишь функцию. возможно имелось в виду что-то типа:
Eсли же вам реально нужно именно оператор+ в классическом смысле, то вы привели недостаточно инфорамации, как уже здесь вам намекали |
|||
|
||||
шарлотта |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 55 Регистрация: 1.3.2017 Репутация: нет Всего: нет |
Разобралась. Большое спасибо!
|
|||
|
||||
sam992 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 1 Регистрация: 25.5.2017 Репутация: нет Всего: нет |
||||
|
||||
Правила форума "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. |