Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Переопределение виртуальной функции 
:(
    Опции темы
шарлотта
Дата 9.5.2017, 01:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 1.3.2017

Репутация: нет
Всего: нет



Здравствуйте!
Требуется реализовать виртуальную функцию сложения в классе Array, переопределив ее в производном классе Fraction
Код

Array Array::operator +(const Array &arr) {
    Array res(*this);
    for (int i = 0; i < size; i++) {
        res.elems[i] += arr.elems[i];
    }
    return res;
}

Не могу понять, как это сделать. Ведь если написать так, то это будет перегрузка, а не переопределение виртуального метода.
Код

Fraction Fraction::operator +(const Fraction &num) {
    Fraction res(*this);
    for (int i = 0; i < size_integer; i++) {
        res.integer[i] += num.integer[i];
    }
    for (int i = 0; i < size_fract; i++) {
        res.fract[i] += num.fract[i];
    }
    return res;
}

Буду очень благодарна за помощь!

Это сообщение отредактировал(а) шарлотта - 9.5.2017, 22:12
PM MAIL   Вверх
vpf
Дата 9.5.2017, 04:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 119
Регистрация: 14.11.2016
Где: Moscow

Репутация: нет
Всего: нет



виртуальный метод не должен иметь тела в классе Array, только объявление.
Поэтому в классе Array вы даете только объявление функции
А в классе Fraction помещаете ее тело, то есть то, что вы дали в первом блоке кода.



PM MAIL IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
tzirechnoy
Дата 9.5.2017, 10:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

Репутация: -1
Всего: 16



Цитата
виртуальный метод не должен иметь тела в классе Array, только объявление.


Нет, это Вы с pure virtual перепутали, да и то в довольно старом понимании.

Цитата
то это будет перегрузка, а не переопределение виртуального метода.


Очень сложно понимать русскую терминологию, которой я дажэ не знаю где искать определения, но если перегрузка -- это overload, а переопределение -- это override, то 
Во-первых это всегда будет overload of an operator +, то есть без перегрузки тут никак не обойдётся.
Во-вторых, чтобы что-то override надо чтобы тот, кого override и тот, кто override находились в базовом и унаследованном классе. Собственно, для того, чтобы это наывалось override это почти единственное требование -- ну, кроме совпадения имени.
В-третьих, чтобы override был virtual -- нужно, чтобы в базовом классе этот оператор был объявлен virtual, а во-вторых -- чтобы сигнатуры функцый достаточно совпадали (допускается смена параметров-ссылок и указателей на ссылки на ковариантные классы).
PM MAIL   Вверх
шарлотта
Дата 9.5.2017, 12:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 1.3.2017

Репутация: нет
Всего: нет



В базовом и производном находятся, virtual объявлен. Проблема возникает как раз с сигнатурой функции. Не очень понимаю, как поменять типы переданных параметров и возвращаемого значения.

Попыталась сделать так, чтобы принимал указатели.
Код

Array& Array::operator +(Array *arr) {
    Array* res(this);
    for (int i = 0; i < size; i++) {
        (*res).elems[i] += (*arr).elems[i];
    }
    return *res;
}

Изменяет вызвавший объект. Буду очень благодарна за помощь!

Это сообщение отредактировал(а) шарлотта - 9.5.2017, 13:10
PM MAIL   Вверх
tzirechnoy
Дата 10.5.2017, 02:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

Репутация: -1
Всего: 16



1) Вообще, примерно всем любопытствующим было бы сильно проще, если бы Вы приводили минимальный компилирующийся пример. Одновременно мы могли бы его сами запустить, и нам не пришлось бы догадываться что у вас там за декларацыи, не забыт ли где virtual и пр.
2) Первый мой ответ был так сделать в динамической памяти, new(Array), но этот ответ очевидно дурацкий, поскольку память утекать будет.

А, собственно... А куда это всё из этого виртуального оператора присваиваться будет? Просто если это будет присваиваться всегда Array (включая ссылки на Array), то оба оператора и должны возвращать Array, а не Fraction. А если это будет присваиваться указателю на Array, то можно возвращать указатели на Array/Fraction, смело размещая их в динамической памяти, и рассчитывая что пользователь потом их удалит.

Собственно, дайте более полную задачу, да.
PM MAIL   Вверх
awesome
Дата 10.5.2017, 13:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 58
Регистрация: 20.10.2010

Репутация: нет
Всего: нет



Цитата(шарлотта @ 9.5.2017,  01:05)
Здравствуйте!
Требуется реализовать виртуальную функцию сложения в классе Array, переопределив ее в производном классе Fraction
Код

Array Array::operator +(const Array &arr) {
    Array res(*this);
    for (int i = 0; i < size; i++) {
        res.elems[i] += arr.elems[i];
    }
    return res;
}

Не могу понять, как это сделать. Ведь если написать так, то это будет перегрузка, а не переопределение виртуального метода.
Код

Fraction Fraction::operator +(const Fraction &num) {
    Fraction res(*this);
    for (int i = 0; i < size_integer; i++) {
        res.integer[i] += num.integer[i];
    }
    for (int i = 0; i < size_fract; i++) {
        res.fract[i] += num.fract[i];
    }
    return res;
}

Буду очень благодарна за помощь!

Вообщем читайте про двойную диспетчеризацию, так как полиморфные бинарные операторы попадают под этот случай. Если вкратце, то вам нужно определить неполиморфный дескриптор, который реализует операции и содержит полиморфные типы, делегируя им выполнение операции.

PM MAIL   Вверх
volatile
Дата 10.5.2017, 15:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



Цитата(шарлотта @  9.5.2017,  01:05 Найти цитируемый пост)
Требуется реализовать виртуальную функцию сложения 

Здесь не сказано реализовать оператор сложения, а всего лишь функцию.
возможно имелось в виду что-то типа:
Код

void Array::add (const Array &arr);
в этом случае реализация банальна

Eсли же вам реально нужно именно оператор+ в классическом смысле, то вы привели недостаточно инфорамации, как уже здесь вам намекали

PM MAIL   Вверх
шарлотта
Дата 10.5.2017, 18:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 1.3.2017

Репутация: нет
Всего: нет



Разобралась. Большое спасибо!
PM MAIL   Вверх
sam992
  Дата 25.5.2017, 16:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 25.5.2017

Репутация: нет
Всего: нет



Привет ребят!
Спасибо за ответы! Они и мне помогли! smile 

http://popupmaker.com/
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1238 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.