Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
DavidTs
3 / 3 / 3
Регистрация: 25.11.2015
Сообщений: 127
19.12.2015, 20:55     Как переопределить перегруженную функцию в производном классе? #1
Как переопределить перегруженную функцию в производном классе?
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; }
()
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zss
Модератор
Эксперт С++
 Аватар для zss
5955 / 5560 / 1788
Регистрация: 18.12.2011
Сообщений: 14,209
Завершенные тесты: 1
19.12.2015, 20:59     Как переопределить перегруженную функцию в производном классе? #2
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; 
    }
};
rikimaru2013
C++ Game Dev
 Аватар для rikimaru2013
2139 / 972 / 223
Регистрация: 30.11.2013
Сообщений: 3,241
19.12.2015, 21:00     Как переопределить перегруженную функцию в производном классе? #3
у Number нету перемменой х - попытайтесь раскрыть глаза.
DavidTs
3 / 3 / 3
Регистрация: 25.11.2015
Сообщений: 127
19.12.2015, 21:04  [ТС]     Как переопределить перегруженную функцию в производном классе? #4
rikimaru2013, Я написал член класса Int.
zss
Модератор
Эксперт С++
 Аватар для zss
5955 / 5560 / 1788
Регистрация: 18.12.2011
Сообщений: 14,209
Завершенные тесты: 1
19.12.2015, 21:05     Как переопределить перегруженную функцию в производном классе? #5
rikimaru2013, Ничего не поделаешь - у виртуальной функции параметр будет ссылкой на базовый класс. Поэтому приходится делать нисходящее приведение к производному классу.
rikimaru2013
C++ Game Dev
 Аватар для rikimaru2013
2139 / 972 / 223
Регистрация: 30.11.2013
Сообщений: 3,241
19.12.2015, 21:06     Как переопределить перегруженную функцию в производном классе? #6
DavidTs, Number& незнает ничего про переменную x и не надо ему это знать? Представьте потом класс SafeInt который еще проверяет переполнение как-то, унаследованый от Int - так снова будете учить его как видить переную с класса SafeInt ? Не пишите так - и не читайте код zss
zss
Модератор
Эксперт С++
 Аватар для zss
5955 / 5560 / 1788
Регистрация: 18.12.2011
Сообщений: 14,209
Завершенные тесты: 1
19.12.2015, 21:08     Как переопределить перегруженную функцию в производном классе? #7
rikimaru2013, Все же Вы не правы. Поскольку экземпляр базового класса создать нельзя,
то и ошибки никогда не будет.
Хочу заметить, что это - распространенная практика. Базовый класс - это интерфейс с набором виртуальных методов и практически не содержит данных, производный класс содержит необходимые данные и реализует виртуальные методы по их обработке.
DavidTs
3 / 3 / 3
Регистрация: 25.11.2015
Сообщений: 127
19.12.2015, 21:12  [ТС]     Как переопределить перегруженную функцию в производном классе? #8
rikimaru2013, А как это правильно реализовать? Правильно ли будет просто перегружать ту же функцию для конкретного класса и просто вызывать их в виртуальных функциях? Например вот так.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.12.2015, 22:00     Как переопределить перегруженную функцию в производном классе?
Еще ссылки по теме:

C++ Как сделать компоненты базового класса доступными в производном классе, но недоступными вне классов?
C++ Как переопределить функцию func2 в классе B
Вызов оператора= в производном классе C++

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

Или воспользуйтесь поиском по форуму:
hoggy
5230 / 2121 / 404
Регистрация: 15.11.2014
Сообщений: 4,812
Завершенные тесты: 1
19.12.2015, 22:00     Как переопределить перегруженную функцию в производном классе? #9
Цитата Сообщение от 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();
    
}
Yandex
Объявления
19.12.2015, 22:00     Как переопределить перегруженную функцию в производном классе?
Ответ Создать тему
Опции темы

Текущее время: 10:53. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru