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

Наследование и виртуальные функции - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Вывод на экран 8 нижних подчеркиваний (с использованием классов) http://www.cyberforum.ru/cpp-beginners/thread209546.html
Необходимо написать программу,с использованием классов, выводящую на экран 8 символов нижней черты "_" ( не знаю точно как ее обозвать). class cherta {public: void vivodcherti() }; void cherta::vivodcherti() {for(int i=0;i<8;i++) {cout<<"_";} } int main
C++ Почему выводит не первый повторяющияся элемент? Написать функцию для поиска первого повторяющиегося элемента #include <iostream> #include <string> using namespace std; char poisk(char a) { char k; http://www.cyberforum.ru/cpp-beginners/thread209489.html
C++ Проверить коректно ли работает программа
Задание: Задание: написать программу, реализующую следующие задания, и реализовать ее графический интерфейс Дан массив размера N. Найти количество его локальных минимумов1|максимумов2. Все нужно с простим интерфейсом программку написал, вот теперь не как не пойму коректно ли она считает, прошу помочь. Очень прошу помочь
Иосиф с выводом трех последних выбывших в порядке их выбывания C++
Пусть n человек, стоящие по кругу, считаются(начиная с первого) считалкой из m слов.человек, на котором считалка заканчивается-выбывает.круг смыкается, счет продолжается с человека, следующего за выбывшим.Напишите программу, выводящую номера трех человек. выбывших последними, в порядке их выбывания.При написании программы следует использовать динамические переменные. Задачу нужно написать на С,...
C++ Элементарное условие. Ввод/вывод http://www.cyberforum.ru/cpp-beginners/thread209469.html
Не могу понять в чем моя ошибка в написании элементарной задачи. Создать в динамической памяти 2 элемента типа int и вывести их на экран... #include <iostream> using namespace std; class X{ private: int *x1; int *x2; public:
C++ работа со строками Входной файл сохраняет следующую информацию по студентам: <Фамилия>, <имя>, <отчество>, <год рождения>, <курс>, <пол>, причем фамилия, имя и отчество имеют не более 12 символов, пол - указывается символами М и Ж, год рождения - целое из 4 цифр, курс - целое от 1 до 5. Данные по студентам отделяются знаком «;». Необходимо написать программу, которая выводит наиболее распространенное мужское и... подробнее

Показать сообщение отдельно
lemegeton
2918 / 1347 / 134
Регистрация: 29.11.2010
Сообщений: 2,721
13.12.2010, 00:04     Наследование и виртуальные функции
Если класс работает с динамическими переменными и хочет самостоятельно работать с памятью, нужно переопределить конструктор копирования и оператор присваивания.

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
class X
{
protected:
        // инкапсуляция данных.
        // данные сокрыты ото всех, кроме классов-потомков
        // помечены подчеркиванием, чтобы не перепутать.
        int* _x;
        int* _y;
public:
        // конструктор по-умолчанию
        X(void) : _x(new int), _y(new int) {}
        // конструктор копирования
        X(const X& other)
                : _x(new int), _y(new int)
        {
                *_x = other.GetX();
                *_y = other.GetY();
        }
        // оператор присваивания
        X& operator= (const X& other)
        {
                // обязательная проверка на то, что не
                // присваиваем самого себя
                if (this!=&other)
                {
                        *_x = other.GetX();
                        *_y = other.GetY();
                }
                return *this;
        }
 
        // аксессоры, константны
        virtual const int GetX() const { return *_x; }
        virtual const int GetY() const { return *_y; }
 
        // мутаторы
        virtual void SetX(int x) { *_x = x; }
        virtual void SetY(int y) { *_y = y; }
 
 
        // виртуальный деструктор, будет корректно
        // вызыватья  для потомков
        virtual ~X()
        {
                delete _x;
                delete _y;
        }
};
 
class Y : public X
{
protected:
        // дополнительное поле
        int *_z;
public:
 
        // конструктор по-умолчанию
        Y(void) : X(), _z(new int) { }
        Y(const Y& other)
                : X(), _z(new int) // инициализация переменных
        {
                *_x = other.GetX();
                *_y = other.GetY();
                *_z = other.GetZ();
        }
 
        // оператор присваивания
        Y& operator= (const Y& other)
        {
                // обязательная проверка на то, что не
                // присваиваем самого себя
                if (this!=&other)
                {
                        *_x = other.GetX();
                        *_y = other.GetY();
                        *_z = other.GetZ();
                }
                return *this;
        }
 
 
        // дополнительный аксессор
        virtual const int GetZ() const { return *_z; }
        // дополнительный мутатор
 
        virtual void SetZ(int z) { *_z = z; }
 
        virtual ~Y()
        {
                delete _x;
                delete _y;
                delete _z;
        }
};
 
int main()
{
        // конструктор по-умолчанию
        X a;
 
        // конструтор копирования
        X b = a;
 
        // оператор присваивания
        a = b;
 
        // вот тут нам понадобится виртуальный деструктор
        X *k = new Y;
 
        // переменная k типа X вызовет деструктор ~Y
        delete k;
 
        return 0;
}
Добавлено через 7 минут
Честно говоря, уже и не помню, откуда я это взял, в памяти отложились странные проблемы с gcc 4.4 и вот такое вот правило.

Добавлено через 6 минут
Конструктор копирования используется при передаче параметра в функцию.
Тут же оператор присваивания.
C++
1
2
3
4
5
6
7
8
9
10
11
12
X a(const X x)
{
        return X();
}
 
int main()
{
        X x, y;
        y = a(x);
 
        return 0;
}
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru