Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
3 / 3 / 8
Регистрация: 25.11.2015
Сообщений: 127

Как переопределить перегруженную функцию в производном классе?

19.12.2015, 20:55. Показов 1083. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Как переопределить перегруженную функцию в производном классе?
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
class Number {
public:
    virtual Number* operator+(Number*)=0;
};
class Int :public Number {
    int x;
public:
    Int(int X=0) : x(X) {}
 
    Number* operator+( Number& N) {x+=N. //????  return this; }
};
Добавлено через 4 минуты
Как получить доступ к x (член класса Int) с помощью N?
Цитата Сообщение от DavidTs Посмотреть сообщение
Number* operator+( Number& N) {x+=N. //???? *return this; }
()
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
19.12.2015, 20:55
Ответы с готовыми решениями:

Как переопределить функцию func2 в классе B
class A { A() {} и тд. public: functions.................... virtual void func1() = 0; class littleClass { ...

Можно ли переопределить функцию-член в унаследованном классе, не объявляя её виртуальной в родительском?
Предположим, есть абстрактный класс Worker. class Worker { protected: char *myName; int value; private: ...

Как в производном классе спрятать методы из базового класса?
Как в производном классе, спрятать методы из базового класса. То есть при создании экземпляра класса производного класса, чтобы некоторые...

8
Модератор
Эксперт С++
 Аватар для zss
13773 / 10966 / 6491
Регистрация: 18.12.2011
Сообщений: 29,243
19.12.2015, 20:59
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Number {
public:
    virtual Number& operator+(Number&)=0;
};
class Int :public Number {
    int x;
public:
    Int(int X=0) : x(X) {}
    Number& operator+( Number& N) 
    {
        x+=static_cast<Int&>(N).x;
        return *this; 
    }
};
1
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
19.12.2015, 21:00
у Number нету перемменой х - попытайтесь раскрыть глаза.
0
3 / 3 / 8
Регистрация: 25.11.2015
Сообщений: 127
19.12.2015, 21:04  [ТС]
rikimaru2013, Я написал член класса Int.
0
Модератор
Эксперт С++
 Аватар для zss
13773 / 10966 / 6491
Регистрация: 18.12.2011
Сообщений: 29,243
19.12.2015, 21:05
rikimaru2013, Ничего не поделаешь - у виртуальной функции параметр будет ссылкой на базовый класс. Поэтому приходится делать нисходящее приведение к производному классу.
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
19.12.2015, 21:06
DavidTs, Number& незнает ничего про переменную x и не надо ему это знать? Представьте потом класс SafeInt который еще проверяет переполнение как-то, унаследованый от Int - так снова будете учить его как видить переную с класса SafeInt ? Не пишите так - и не читайте код zss
0
Модератор
Эксперт С++
 Аватар для zss
13773 / 10966 / 6491
Регистрация: 18.12.2011
Сообщений: 29,243
19.12.2015, 21:08
rikimaru2013, Все же Вы не правы. Поскольку экземпляр базового класса создать нельзя,
то и ошибки никогда не будет.
Хочу заметить, что это - распространенная практика. Базовый класс - это интерфейс с набором виртуальных методов и практически не содержит данных, производный класс содержит необходимые данные и реализует виртуальные методы по их обработке.
0
3 / 3 / 8
Регистрация: 25.11.2015
Сообщений: 127
19.12.2015, 21:12  [ТС]
rikimaru2013, А как это правильно реализовать? Правильно ли будет просто перегружать ту же функцию для конкретного класса и просто вызывать их в виртуальных функциях? Например вот так.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
19.12.2015, 22:00
Цитата Сообщение от zss Посмотреть сообщение
Поскольку экземпляр базового класса создать нельзя,
то и ошибки никогда не будет.
http://rextester.com/COIRI58145


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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
#include <iostream>
#include <stdexcept>
 
#ifndef OUT_TO_STREAM
    #define OUT_TO_STREAM(type_)  \
        template<class T>friend   \
        ::std::basic_ostream<T>&  \
        operator<<(::std::basic_ostream<T>& os, const type_& obj )
#endif
 
 
 
struct Number {
    
    virtual ~Number(){}
    
    virtual std::string AboutMe()const = 0;
 
    virtual const Number& operator+=(const Number&)=0;
    
    OUT_TO_STREAM(Number)
    {
        return os<< obj.AboutMe();
    }
};
 
 
struct Int : Number {
    
    int x;
 
    Int(const int X=0) : x(X) {}
    const Number& operator+=(const Number& N) 
    {
        const auto* valid = dynamic_cast<const Int*>(&N);
        
        if(!valid)
            throw std::logic_error("invalid cast of type");
        
        x += valid->x;
        return *this;
    }
    
    virtual std::string AboutMe()const 
    {
        return std::to_string(x);
    }
};
 
struct Float : Number {
    float x;
 
    Float(const float X=0) : x(X) {}
    const Number& operator+=(const Number& N) 
    {
        const auto* valid = dynamic_cast<const Float*>(&N);
        
        if(!valid)
            throw std::logic_error("invalid cast of type");
        
        x += valid->x;
        return *this;
    }
    
    virtual std::string AboutMe()const 
    {
        return std::to_string(x);
    }
};
 
 
void plus(Number& l, const Number& r)
{
    l += r;
}
 
void simulate_error()
{
    try{
        
        Int i(10);
        Float f(10);
        plus(i,f);
        
    }
    catch(const std::exception& e)
    {
        std::cout<<"detected error: "<< e.what();
    }
}
 
int main()
{
    std::cout << "Hello, world!\n";
    
    Int val1(10);
    Int val2(10);
    
    std::cout << "before: val1 = " << val1<< '\n';
    
    plus(val1,val2);
    
    std::cout << "after : val1 = " << val1<< '\n';
    
    simulate_error();
    
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
19.12.2015, 22:00
Помогаю со студенческими работами здесь

Как в базавом классе узнать переопределен его метод в производном
Как в базовом классе узнать переопределен ли его метод в производном? Добавлено через 17 минут Нашел способ и он вроде работает: ...

Как в производном классе скрыть некоторые свойства и методы базового?
Есть класс, производный от некого базового класса. Как в моем классе скрыть некоторые свойства и методы базового?

Как сделать компоненты базового класса доступными в производном классе, но недоступными вне классов?
Как сделать компоненты базового класса доступными в производном классе, но недоступными вне классов?

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

Наследование. Как сделать так, чтобы присвоение полей исполнилось только в производном классе?
Здравствуйте. При создании экземпляра DerivedClass instance = new DerivedClass(); С начало выполняется присвоение полям значений в...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru