Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 25.09.2016
Сообщений: 27
1

Виртуальные функции

23.02.2018, 14:30. Просмотров 868. Ответов 3
Метки нет (Все метки)


Объясните строку 106
И еще, почему перед каждой x1 x2 y стоит звездочка.
Я вроде понимаю что это указатель, но зачем он именно каждый раз ставится, нельзя без него обойтись?


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
108
109
#include <iostream>
using namespace std;
 
class X 
{
     
    protected:
        float *x1, *x2;  
    public:
      
        X(float a, float b)
        {
 
            x1 = new float;
            x2 = new float;
         
            *x1 = a;
            *x2 = b;
        }
        
                                                                                    // виртуальная функция просмотра текущего состояния базового класса
        virtual void view()
        {
            cout << "x1=" << *x1 << " x2=" << *x2 << endl;
        }
        
                                                                                    // виртуальная функция установки состояния базового класса в новое значение
        virtual void set_new()
        {
             
            cout << "Vvedite x1: ";
            cin >> *x1;
            cout << "Vvedite x2: ";
            cin >> *x2;
        }
             
      
        ~X()
        {
 
            delete x1;
            delete x2;
        }
};
 
 
class Y:public X
{
    private:
        float *y;  
    public:
        
         
        Y(float a, float b, float c):X(a,b)  
        {
             
            y = new float;
          // *y = c;
        }
        
                                                                                    // виртуальная функция просмотра текущего состояния класса наследника
        virtual void view()
        {
             
            cout << "x1=" << *x1 << " x2=" << *x2 << " y=" << *y << endl;
        }
        
                                                                                    // виртуальная функция установки новых значений 
        virtual void set_new()
        {
            cout << "Vvedite x1: ";
            cin >> *x1;
            cout << "Vvedite x2: ";
            cin >> *x2;
            cout << "Vvedite y: ";
            cin >> *y;
        }
        
        ~Y()
        {
            delete y;
        }
        
        void Run()
        {
            cout << "Otvet: " << ( *x1 - *x2 )* *y << endl;
        }
};
 
int main()
{
    X *t;  
    t = new X(0,0);  
    t->view();  
    t->set_new();  
  //  t->view();  
    
    delete t;  
    
    t = new Y(0, 0, 0);  
    t->view();  
    t->set_new();  
    t->view();  
    
 
    ((Y*) t)->Run();    
    
    delete t;  
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.02.2018, 14:30
Ответы с готовыми решениями:

Виртуальные и чисто виртуальные функции
Чем они отличаются?? если можно, с примерами. И как из виртуальной функции сделать чисто...

Виртуальные функции
Объясните пожалуйста зачем нужны чисто виртуальные функции?

виртуальные функции
Всем привет, помогите с исправлением функции #include&lt;iostream.h&gt; #include&lt;conio.h&gt;...

виртуальные функции
Помогите плиз с вертуальными функциями. Некак немогу понят вот эту задачу: переопределяемая...

3
221 / 148 / 79
Регистрация: 14.03.2016
Сообщений: 459
23.02.2018, 17:00 2
Лучший ответ Сообщение было отмечено Windtouch как решение

Решение

Видимо ты плохо усвоил тему по указателям, советую перечитать. Сам указатель хранит в себе адрес на объект, а не сам объект, потому, если мы хотим поменять значение того, что лежит по данному адресу, нужно его разыменовать, т.е. поставить перед нем *. Если ты присвоишь указателю что либо кроме адреса, то он будет указывать на не существующую область в памяти, что приведет к ошибке доступа при каких-либо действий с ним.

В строчке 106 идет преобразование переменной t типа X*, в тип Y*. Преобразовываем мы её для доступа к функции Run(), которая есть только в дочернем классе Y, благо С++ позволяет нам так делать. Если бы функция Run() была бы объявлена в классе X и была бы ещё и виртуальной, то мы бы могли вызвать функ. Run() класса Y, не преобразовывая переменную t к Y*. Спрашивай, если чего-то не понял.
0
0 / 0 / 0
Регистрация: 25.09.2016
Сообщений: 27
21.03.2018, 23:08  [ТС] 3
Цитата Сообщение от Cortas Посмотреть сообщение
к
Подскажите пожалуста по поводу 54 строки
0
221 / 148 / 79
Регистрация: 14.03.2016
Сообщений: 459
23.03.2018, 12:32 4
Windtouch, конструктор класса Y, инициализируемый 3 переменными, две из которых инициируются таким же способом что и в конструкторе родительского класса X, а работа с третьей производиться непосредственно в теле конструктора Y.
Кстати, если ты до сих пор не сделал деконструктор базового класса X виртуальным, то сделай это, иначи, при удалении объекта класса Y, освободится не вся память, выделенная под него!
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.03.2018, 12:32

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

Виртуальные функции
Какие происходят изменения, когда в классе объявляем одну или несколько функций виртуальными? ...

Виртуальные функции
Составить программу в С Buildere. Объявить базовый класс с именем person {имя, возраст, группа}....

Виртуальные функции
Имеется базовый класс Shape: class Shape { protected: virtual void drawShape() { } } и...

Виртуальные функции
Разработать программу с использованием наследования классов, реализующую классы: Земноводное(ареал...

Виртуальные функции
Здравствуйте,уважаемые посетители форума.Пишу программу созданию фигур и их перемещению на экране...

Виртуальные функции
Пожалуйста, подскажите как быть: class Circles; class Rectangs; class Snake { public:...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.