-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmain.cpp
More file actions
124 lines (104 loc) · 4.51 KB
/
main.cpp
File metadata and controls
124 lines (104 loc) · 4.51 KB
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
123
124
#include <iostream>
#include <memory>
using namespace std;
// Базовый класс
class Base {
public:
Base() { cout << "Base конструктор\n"; }
Base(Base* obj) { cout << "Base конструктор копирования из указателя\n"; }
Base(Base& obj) { cout << "Base конструктор копирования\n"; }
virtual ~Base() { cout << "Base деструктор\n"; }
// Перекрытый метод (не виртуальный)
void show() { cout << "Base show()\n"; }
// Виртуальный метод
virtual void virtualShow() { cout << "Base virtualShow()\n"; }
// Методы для проверки типа
virtual string classname() { return "Base"; }
virtual bool isA(string className) { return className == "Base"; }
};
// Класс-наследник
class Desc : public Base {
public:
Desc() { cout << "Desc конструктор\n"; }
Desc(Desc* obj) { cout << "Desc конструктор копирования из указателя\n"; }
Desc(Desc& obj) { cout << "Desc конструктор копирования\n"; }
~Desc() { cout << "Desc деструктор\n"; }
// Перекрытие метода (скрывает базовый)
void show() { cout << "Desc show()\n"; }
// Переопределение виртуального метода
void virtualShow() override { cout << "Desc virtualShow()\n"; }
// Переопределение методов проверки типа
string classname() override { return "Desc"; }
bool isA(string className) override {
return className == "Desc" || Base::isA(className);
}
};
// Функции для демонстрации передачи параметров
void func1(Base obj) { cout << "func1 (передача по значению)\n"; }
void func2(Base* obj) { cout << "func2 (передача через указатель)\n"; }
void func3(Base& obj) { cout << "func3 (передача по ссылке)\n"; }
// Функции для демонстрации возврата значений
Base func4() {
Base obj;
cout << "func4 создает статический объект\n";
return obj;
}
Base* func5() {
Base* obj = new Base();
cout << "func5 создает динамический объект\n";
return obj;
}
Base& func6() {
static Base obj;
cout << "func6 возвращает статическую ссылку\n";
return obj;
}
int main() {
cout << "=== Демонстрация виртуальных методов ===\n";
Base* basePtr = new Desc();
basePtr->show(); // Вызовет Base::show() (не виртуальный)
basePtr->virtualShow(); // Вызовет Desc::virtualShow()
delete basePtr;
cout << "\n=== Проверка типов ===\n";
Base* obj = new Desc();
cout << "classname: " << obj->classname() << endl;
cout << "isA Base: " << obj->isA("Base") << endl;
cout << "isA Desc: " << obj->isA("Desc") << endl;
delete obj;
cout << "\n=== Приведение типов ===\n";
Base* testObj = new Desc();
if (dynamic_cast<Desc*>(testObj)) {
cout << "Приведение через dynamic_cast успешно\n";
}
if (testObj->isA("Desc")) {
cout << "Приведение через isA успешно\n";
}
delete testObj;
cout << "\n=== Передача параметров ===\n";
Desc descObj;
cout << "--- func1 (по значению): ";
func1(descObj); // Вызовет конструктор копирования Base
cout << "--- func2 (указатель): ";
func2(&descObj);
cout << "--- func3 (ссылка): ";
func3(descObj);
cout << "\n=== Возврат из функций ===\n";
Base returnedObj = func4();
Base* returnedPtr = func5();
Base& returnedRef = func6();
delete returnedPtr; // Освобождаем динамическую память
cout << "\n=== Умные указатели ===\n";
{
unique_ptr<Base> uptr = make_unique<Desc>();
cout << "unique_ptr выходит из области видимости...\n";
}
{
shared_ptr<Base> sptr1 = make_shared<Desc>();
{
shared_ptr<Base> sptr2 = sptr1;
cout << "Количество ссылок: " << sptr1.use_count() << endl;
}
cout << "Количество ссылок: " << sptr1.use_count() << endl;
}
return 0;
}