Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/7: Рейтинг темы: голосов - 7, средняя оценка - 5.00
 Аватар для GoldenId
142 / 143 / 64
Регистрация: 11.11.2010
Сообщений: 877
Записей в блоге: 10

Сложение объектов базового и наследуемых классов через виртуальную функцию

01.07.2017, 19:34. Показов 1382. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Нужно определить базовый класс с виртуальной функцией сложения. Кроме того перегрузка этой же виртуальной функции должна складывать экземпляры классов-наследников. Такое задание. Вроде бы.
Лучшее, что мне пришло в голову:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
class Base
{
public:
    virtual Base* add( const Base* rhs ) const;
...
};
 
 
class Derived1 : public Base
{
public:
    Base* add( const Base* rhs ) const override;
...
};
 
Base* Base::add( const Base* rhs ) const
{
    if( typeid( *rhs ) != typeid( Base ) )
        throw std::runtime_error(...);
    Base result = new Base(...);
    ...
    return result; // привет, потенциальные утечки памяти
}
 
Base* Derived1::add( const Base* rhs ) const
{
    if( typeid( *rhs ) != typeid( Derived1 ) )
        throw std::runtime_error(...);
    Derived1 result = new Derived1(...);
    ...
    return result; // те же утечки
}
Или можно было бы делать через std::unique_ptr, но в принципе хрен редьки не слаще.

Скажите, это действительно не самое продуманное задание или я туплю?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
01.07.2017, 19:34
Ответы с готовыми решениями:

Наследование static атрибута(хранение количества объектов наследуемых классов)
Есть абстрактный класс base, от него наследуются 3 класса child1 child2 child3. Создается множество объектов одного из этих трех классов, в...

Для описанной иерархии классов создать виртуальную функцию
Здравствуйте, прошу помощи. Нужно сделать задание, при этом, вид порождения побочных классов должен быть обязательно private. Для...

Вызов наследуемых методов из базового класса
Всем доброго времени суток, перейду сразу к сути. Код: class Base { protected: public: virtual void...

4
296 / 125 / 106
Регистрация: 30.10.2015
Сообщений: 690
02.07.2017, 03:30
GoldenId, не хотите вернуть из add объект, а не указатель?
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
02.07.2017, 03:46
Цитата Сообщение от Nemovok Посмотреть сообщение
не хотите вернуть из add объект, а не указатель?
и как вы это себе представляете?
0
296 / 125 / 106
Регистрация: 30.10.2015
Сообщений: 690
02.07.2017, 05:08
Цитата Сообщение от hoggy Посмотреть сообщение
и как вы это себе представляете?
Уже попробовал, думал что получится(
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#include <iostream>
 
class Base
{
private:
    int value;
public:
    Base();
    Base( const int v ); 
    virtual Base Add( const Base &b ) const;
    virtual void ShowData() const;
};
 
Base::Base() 
    : value( -1 ) {}
 
Base::Base( const int v ) 
    : value( v )  {} 
 
Base Base::Add( const Base &b ) const
{ return Base( this->value + b.value ); }
 
void Base::ShowData() const 
{ std::cout << value << std::endl; }
 
 
class Derived : public Base
{
private:
    int value_derived;
public:
    Derived();
    Derived( const int v_derived );
    Base Add( const Base &b ) const;
    void ShowData() const;
};
 
Derived::Derived() 
    : Base() {}
 
Derived::Derived( const int v_derived) 
    : Base(), value_derived( v_derived ) {}
 
void Derived::ShowData() const
{ std::cout << this->value_derived << std::endl; }
 
Base Derived::Add( const Base &b ) const
{ 
    // Увы
}
 
int main() 
{ 
    Base b1( 1 );
    Base b2( 2 );
    b1.Add( b2 ).ShowData();
 
    Derived d1( 1 );
    Derived d2( 2 );
    d1.Add( d2 ).ShowData();
}
Добавлено через 6 минут
С базовым классом выходит, а с производным нет(если возвращаю объект Derived, то при сложении выводит не то).
0
 Аватар для GoldenId
142 / 143 / 64
Регистрация: 11.11.2010
Сообщений: 877
Записей в блоге: 10
02.07.2017, 17:47  [ТС]
Цитата Сообщение от Nemovok Посмотреть сообщение
GoldenId, не хотите вернуть из add объект, а не указатель?
Хочу. Но так просто это не получается. Можно делать метод add с сигнатурой через двойные ссылки... или как они правильно называются... Видимо, я повторил то, что пытался сделать Nemovok.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
class Base
{
public:
    Base( int param ) : field( param ) {}
    virtual Base&& add( const Base& rhs ) const;
    virtual void out( std::ostream& s ) const;
private:
    int field;
};
 
class Derived1 : public Base
{
public:
    Derived1( double param ) : Base( param ), derived_field( param ) {}
    Base&& add( const Base& rhs ) const override;
    void out( std::ostream& s ) const override;
private:
    double derived_field;
};
 
Base&& Base::add( const Base& rhs ) const
{
    if( typeid( rhs ) != typeid( Base ) )
        throw std::runtime_error( "" );
    return std::forward<Base>( Base( field + rhs.field ) );
}
 
void Base::out( std::ostream& s ) const
{
    s << "Base: " << field;
}
 
 
Base&& Derived1::add( const Base& rhs ) const
{
    if( typeid( rhs ) != typeid( Derived1 ) )
        throw std::runtime_error( "" );
    Derived1 result( derived_field + ( ( Derived1& )rhs ).derived_field );
    return std::forward<Derived1>( result );
}
 
void Derived1::out( std::ostream& s ) const
{
     s << "Derived1: " << derived_field;
}
 
void foo( const Base& a, const Base& b );
 
int main()
{
    Base b1( 1 ), b2( 2 );
    Derived1 d1( 3.14 ), d2( 2.71 );
    foo( b1, b2 );
    foo( d1, d2 );
}
 
void foo( const Base& a, const Base& b )
{
    a.out( std::cout );
    std::cout << " + ";
    b.out( std::cout );
    std::cout << " = ";
    a.add( b ).out( std:: cout );
    std::cout << std::endl;
}
Вывод:
Code
1
2
Base: 1 + Base: 2 = Base: 2686024
Derived1: 3.14 + Derived1: 2.71 = Derived1: 6.94928e-308
Объясните.

Добавлено через 4 минуты
Кроме того, можно ли как-то определить operator <<, чтобы можно было сделать и для Base и для Derived1 так:
C++
1
2
3
4
void foo( const Base& a, const Base& b )
{
    std::cout << a << " + " << b << " = " << a.add( b ) << std::endl;
}
?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
02.07.2017, 17:47
Помогаю со студенческими работами здесь

Как через базовый класс вызывать виртуальную функцию во всех потомках?
Ну например, есть класс: class BATYANA { BATYANA(); virtual ~BATYANA(); virtual int Test(); }

Из трех наследуемых классов получить массив родителя
Всем мира! Не один раз вы меня выручали, помогите, пожалуйста и в этот раз. Расту. И вопросы становятся глобальней. В общем, нашел такую...

Как правильно реализовать событие и подписку на него через несколько наследуемых классов?
Всё еще работаю над игрой Морской Бой в свободное время. И есть у меня такая структура: Game class, Battlefield Class, Cell Class....

Занести из файла объекты производных классов в массив объектов базового класса
Здравствуйте. Что в этом коде изменить, чтобы объекты производных классов заносились из файла? using System; namespace...

Список наследуемых классов
Здравствуйте. Скажите пожалуйста можно ли получить список всех классов, которые наследуются от определенного класса. class first{} ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а привычная функция main(). . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru