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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Poplavskiy S
0 / 0 / 0
Регистрация: 27.05.2013
Сообщений: 10
#1

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

05.12.2013, 03:58. Просмотров 529. Ответов 0
Метки нет (Все метки)

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()"
}
Добавить виртуальные методы просмотра текущего состояния и переустановки объектов базового класса в новое состояние
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.12.2013, 03:58
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Добавить виртуальные методы просмотра текущего состояния и переустановки объектов базового класса в новое состояние (C++):

Виртуальные методы класса - C++
Скажите, зачем нужны виртуальные методы? Почему нельзя использовать стандартные? Спасибо.

Вызвать из базового класса методы потомков - C++
Я не уверен как сделать, но нужно с базового вызвать все другие функции у наследников. class CMain { public: virtual void...

Объекты производного класса не наследуют методы базового - C++
Доброго всем дня! Вот такая у меня проблема возникла - объекты производного класса свободно вычитаются, но почему-то не складываются,...

Заполнить массив объектов базового класса - C++
Суть задачи: есть базовый класс Участник и производные от него Студент и Школьник. Нужно заполнить массив объектов базового класса. ...

Закрыть все переменные класса и добавить методы доступа к ним - C++
Привет ребят помогите пожалуйста, создал класс открытый, нужно закрыть все переменные и создать функцию с помощью которой можно будет...

Методы get и set для объектов базового класса - C#
class B:A { B():base(){} public A a; public A aA //нужно определить открытое свойство, которое бы осуществляла...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.12.2013, 03:58
Привет! Вот еще темы с ответами:

Массив объектов базового класса, позволяющий работать с набором объектов — чтение, вывод - C#
Расширить программы с классами. Каждый разработанный класс считать базовым; для каждого такого класса описать производный класс - массив...

Как правильно создать массив объектов текущего класса в методе данного класса? - C++ Builder
Привет! Ставится задача создания метода, который формирует массив объектов. Правильно ли делать этот метод внутри класса, экземпляром...

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

Методы расширения, добавить новое свойство - C#
Можно допустим стандартный класс string расширить (добавить новый метод), это делается так: public static class StringHelper { ...


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

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

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