Skip to content

Commit 8fe0c8e

Browse files
committed
Add Week 11
1 parent 67749be commit 8fe0c8e

File tree

2 files changed

+133
-0
lines changed

2 files changed

+133
-0
lines changed

Practicum/Week 11/README.md

+132
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,132 @@
1+
# Седмица 11 - Виртуални методи и полиморфизъм в Elder Thing
2+
3+
Този проект разширява системата за управление на герой от играта Elder Thing, въвеждайки концепции за виртуални методи и полиморфизъм. Имплементацията позволява динамично изпълнение на методи в зависимост от реалния тип на обекта по време на изпълнение.
4+
5+
## Структура на проекта
6+
7+
Проектът включва следните файлове:
8+
- `character.hpp` - декларация на базовия клас Character с виртуални методи
9+
- `character.cpp` - имплементация на методите за базовия клас Character
10+
- `astrologer.hpp` - декларация на класа Astrologer с презаписани виртуални методи
11+
- `astrologer.cpp` - имплементация на методите за класа Astrologer
12+
- `confessor.hpp` - декларация на класа Confessor с презаписани виртуални методи
13+
- `confessor.cpp` - имплементация на методите за класа Confessor
14+
- `spell.hpp` - модифицирана версия на класа Spell с виртуални методи
15+
- `spell.cpp` - имплементация на методите за класа Spell
16+
- `spell_types.hpp` - декларации на наследените класове за различни видове магии
17+
- `spell_types.cpp` - имплементация на методите за различните видове магии
18+
- `combat_manager.hpp` - нов клас за управление на битки с полиморфни обекти
19+
- `combat_manager.cpp` - имплементация на класа за управление на битки
20+
- `main.cpp` - главна програма, демонстрираща концепциите за полиморфизъм
21+
22+
## Виртуални методи и полиморфизъм
23+
24+
Проектът демонстрира следните концепции:
25+
26+
1. **Виртуални методи**:
27+
- Базовият клас `Character` дефинира виртуални методи за общо поведение
28+
- Дъщерните класове имплементират своя специфична версия на тези методи
29+
- Виртуалните методи позволяват динамично свързване (runtime binding)
30+
31+
2. **Виртуални деструктори**:
32+
- Базовият клас `Character` има виртуален деструктор
33+
- Гарантира правилното освобождаване на ресурси при унищожаване на обект чрез указател към базов клас
34+
35+
3. **Полиморфизъм**:
36+
- Масив или колекция от указатели към базовия клас може да съдържа обекти от различни типове
37+
- Чрез указател към базов клас може да се извиква правилната версия на метод според реалния тип на обекта
38+
39+
4. **Работа с полиморфни обекти**:
40+
- Нов клас `CombatManager` демонстрира управление на битки между различни видове герои
41+
- Използва се dynamic_cast и typeid за идентифициране на реалния тип на обект
42+
43+
## Виртуален деструктор
44+
45+
Когато базовия клас бъде унищожен чрез указател, виртуалният деструктор гарантира, че първо ще бъде извикан деструкторът на най-вътрешния наследник, след което деструкторите на родителските класове. Това е критично за предотвратяване на изтичане на памет.
46+
47+
### Пример за виртуален деструктор
48+
```cpp
49+
class Character {
50+
public:
51+
// Виртуален деструктор
52+
virtual ~Character() {
53+
// Освобождаване на общи ресурси
54+
}
55+
// ...
56+
};
57+
```
58+
59+
## Виртуални методи в Character
60+
61+
Следните методи са дефинирани като виртуални, за да могат дъщерните класове да ги презаписват:
62+
63+
### Виртуални методи
64+
- `virtual void attack(Character* target)` - атака срещу друг герой
65+
- `virtual void defend()` - защитна позиция
66+
- `virtual void useSpecialAbility()` - използване на специална способност
67+
- `virtual std::string getClassName() const` - връща името на класа
68+
- `virtual int calculateDamage() const` - изчислява базовите щети
69+
- `virtual bool canUseSpell(const Spell* spell) const` - проверява дали героят може да използва определен тип магия
70+
71+
### Имплементация в дъщерни класове
72+
Всеки дъщерен клас (Astrologer, Confessor) имплементира тези методи според собствената си логика, което позволява различно поведение в зависимост от типа на героя.
73+
74+
## Клас CombatManager
75+
76+
Нов клас, който демонстрира използването на полиморфизъм:
77+
78+
### Член данни
79+
- `characters` - масив от указатели към Character
80+
- `characterCount` - брой герои в системата
81+
82+
### Методи
83+
- `addCharacter(Character* character)` - добавя герой към системата
84+
- `removeCharacter(Character* character)` - премахва герой от системата
85+
- `executeCombatRound()` - изпълнява един рунд от битката
86+
- `getCharacterByType(const std::type_info& type)` - връща герой от специфичен тип
87+
- `displayBattleStatus()` - показва текущото състояние на всички герои
88+
89+
## Модификации в йерархията на магиите
90+
91+
Класът Spell също е модифициран с виртуални методи:
92+
93+
### Виртуални методи в Spell
94+
- `virtual void cast(Character* caster, Character* target)` - прилагане на магията
95+
- `virtual std::string getSpellType() const` - връща типа на магията
96+
- `virtual int calculateEffectPower(const Character* caster) const` - изчислява силата на ефекта
97+
98+
### Имплементация в дъщерните класове
99+
- `SorcerySpell` имплементира методите с фокус върху висока атака и бонус от интелигентност
100+
- `IncantationSpell` имплементира методите с фокус върху балансирана атака и бонус от вяра
101+
102+
## Демонстрация в main.cpp
103+
104+
Програмата включва примери за:
105+
- Създаване на обекти от различни класове герои
106+
- Работа с указатели към базов клас, сочещи към обекти от различни типове
107+
- Масив от указатели към базов клас, съдържащ разнородни обекти
108+
- Динамично свързване на виртуални методи по време на изпълнение
109+
- Използване на CombatManager за симулация на битка
110+
- Използване на dynamic_cast за идентификация и typeinfo за проверка на типове
111+
112+
## Забележка за командата за визуализиране на виртуалните таблици
113+
114+
За да визуализирате виртуалните таблици на компилираните класове, може да използвате следната команда:
115+
116+
### Подробна визуализация в текстов файл
117+
```bash
118+
g++ -fdump-class-hierarchy character.cpp astrologer.cpp confessor.cpp spell.cpp spell_types.cpp main.cpp -o elder_thing
119+
```
120+
Тази команда ще създаде файлове с разширение `.class` за всеки клас, съдържащи подробна информация за виртуалните таблици.
121+
122+
### Опростена визуализация в терминала
123+
```bash
124+
g++ -fdump-lang-class character.cpp astrologer.cpp confessor.cpp spell.cpp spell_types.cpp main.cpp -o elder_thing
125+
```
126+
Тази команда ще покаже по-опростена информация за виртуалните таблици директно в терминала.
127+
128+
## Примерни разширения
129+
- Добавяне на интерфейси (абстрактни класове) за дефиниране на общо поведение
130+
- Имплементация на по-сложна полиморфна йерархия с повече видове герои
131+
- Създаване на система за събития, където различни видове герои реагират по различен начин
132+
- Добавяне на шаблони за дизайн, използващи полиморфизъм (като Strategy, Visitor или Observer)

README.md

+1
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
### [:eight: Static, const](https://github.com/xKrashx/Object_Oriented_Programming/tree/main/Practicum/Week%2008)
2424
### [:nine: Operator overloading](https://github.com/xKrashx/Object_Oriented_Programming/tree/main/Practicum/Week%2009)
2525
### [:one::zero: Inheritance](https://github.com/xKrashx/Object_Oriented_Programming/tree/main/Practicum/Week%2010)
26+
### [:one::two: Virtual functions, tables, polymorphism](https://github.com/xKrashx/Object_Oriented_Programming/tree/main/Practicum/Week%2011)
2627

2728
## :pushpin: Additional materials and resources:
2829
### [:bug: How to debug multiple C++ source files in VSCode](https://github.com/xKrashx/Object_Oriented_Programming/tree/main/Misc/Tutorials)

0 commit comments

Comments
 (0)