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

Добавить виртуальные методы просмотра текущего состояния и переустановки объектов базового класса в новое состояние - C++

Восстановить пароль Регистрация
 
Poplavskiy S
0 / 0 / 0
Регистрация: 27.05.2013
Сообщений: 10
05.12.2013, 03:58     Добавить виртуальные методы просмотра текущего состояния и переустановки объектов базового класса в новое состояние #1
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
110
111
112
113
114
115
116
117
118
119
120
121
122
#include <iostream>
#include <stdlib.h>
 using namespace std;
//Объявляем базовый класс
class X 
{
    // раздел того, что будет доступно детям, но невидно извне.
    protected:
        int *x1, *x2; // 2 поля с динамическим хранением
 
    // раздел того, что доступно всем, в т.ч. извне.
    public:
      
        // конструктор с параметрами, обычная инициализация
        X(int a, int b)
        {
            // просим память под переменные
            x1 = new int;
            x2 = new int;
            // записываем в них собсно значения
            *x1 = a;
            *x2 = b;
        }
        
        // виртуальная функция просмотра текущего состояния базового класса
        virtual void view()
        {
            cout << "x1=" << *x1 << " x2=" << *x2 << endl;
        }
        
        // виртуальная функция установки состояния базового класса в новое значение
        virtual void set_new()
        {
            // читаем новые значения х1, х2 с консоли
            cout << "Input x1: ";
            cin >> *x1;
            cout << "Input x2: ";
            cin >> *x2;
        }
             
        // деструктор базового класса
        ~X()
        {
            // старательно чистим память, которую просили в конструкторе
            delete x1;
            delete x2;
        }
};
 
// производный класс У, унаследованный от Х.
class Y:public X
{
    private:
        int *y; //аналогично, тока раз детей у класса У не будет, спрячем поле как прайвет.
        
    public:
        
        // конструктор с инициализацией списком.
        Y(int a, int b, int c):X(a,b) // вот тут дернули конструктор базового класса Х(a,b) передав туда параметры - чтобы записалось х1, х2
        {
            // уже знакомым способом просим память и заполняем значением новую переменную этого класса
            y = new int;
            *y = c;
        }
        
        // переопределенный метод просмотра текущего состояния объекта. Поля-то у нас 3 теперь, надо выводить их все.
        virtual void view()
        {
            // х1, х2 тут доступны, т.к. они protected в Х, а значит унаследовались от базового класса.
            cout << "x1=" << *x1 << " x2=" << *x2 << " y=" << *y << endl;
        }
        
        // переопределенный метод установки нового значения. Опять-таки, поля у нас аж 3, и снова х1, х2 видны тут.
        virtual void set_new()
        {
            cout << "Input x1: ";
            cin >> *x1;
            cout << "Input x2: ";
            cin >> *x2;
            cout << "Input y: ";
            cin >> *y;
        }
        
        // деструктор класса У. в нем очищаем память, которую просили в конструкторе.
        ~Y()
        {
            delete y;
        }
        
        // собсно, метод что-то вычисляющий и выводящий значение на консоль.
        void Run()
        {
            cout << "Res: " << ( *x1 - *x2 ) / *y << endl;
        }
};
 
void main()
{
    X *t; // объявили указатель на базовый класс.
    t = new X(10,20); // создали новый объект Х[х1=10, х2=20]
    t->view(); // дернули у объекта метод просмотра. Получим "х1=10 х2=20"
    t->set_new(); // запишем в него чет новое, вызвав метод установки новых значений.
    t->view(); // дернули опять просмотр. Получим то, что ввели на предыдущем шаге.
    
    delete t; // удалим объект класса Х, тут у него дернулся дестркутор ~X(), и память освободилась
    
    t = new Y(100, 50, 2); // создадим экземпляр класса У[x1=100, x2=50, y=2], но указывать на него будет все тот же указатель.
    t->view(); //дернули у него метод просмотра. Вот тут сработала виртуализация, и мы получили не "х1=100 х2=50" а "х1=100 х2=50 у=2"
    t->set_new(); // аналогичным образом простаавим новые значения. сработает виртуализация, и нас спросят не про 2 параметра, а уже про 3.
    t->view(); // посмотрим, что же мы там ввели в этот игрэк.
    
    // танцы с бубном: просто вызвать метод Run() типа так: t->Run(); мы не можем, т.к. у класса Х этого метода нет, 
    // он есть только у класса Y. Поэтому сначала преобразуем тип указателя к типу Y* сделав ((Y*) t), 
    // а потом у уже полученного таким образом указателя Y* вызовем метод Run(). 
    // А если бы было:
    // Y* p = new Y(1,2,3);
    // то можно бы было вызвать сразу
    // p->Run();
    ((Y*) t)->Run();    
    
    delete t; // удаляем объект класса У - тут дернеться деструктор сначала "~Y()" а затем "~X()"
}
Добавить виртуальные методы просмотра текущего состояния и переустановки объектов базового класса в новое состояние
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.12.2013, 03:58     Добавить виртуальные методы просмотра текущего состояния и переустановки объектов базового класса в новое состояние
Посмотрите здесь:

Виртуальные методы класса C++
C++ Использование перегруженного оператора ввода/вывода в поток базового класса для объекта производного класса
C++ Вызов метода производного класса через обращение к методу базового класса
C++ Как построить экземпляр дочернего класса на основе готового экземпляра базового класса?
C++ Закрыть все переменные класса и добавить методы доступа к ним
C++ Создать массив указателей базового класса и присвоить ему адреса каждого из екземпляров класса
C++ Вызвать из базового класса методы потомков
Указатель на объект базового класса и адрес объекта производного класса C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

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