В игре Source SDK
-
Автор темы
- #1
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
В данной статье я расскажу про
виртуальные методы.
Виртуальный метод даёт возможность переопределения
метода в производном классе.
Представим ситуацию:
У нас есть класс CUsers имеющий метод
GetNickName() , а также производный класс CP45H3 в котором нам
нужно переопределить метод GetNickName().
Если мы опишем такой код:
виртуальные методы.
Виртуальный метод даёт возможность переопределения
метода в производном классе.
Представим ситуацию:
У нас есть класс CUsers имеющий метод
GetNickName() , а также производный класс CP45H3 в котором нам
нужно переопределить метод GetNickName().
Если мы опишем такой код:
Код:
class CUsers{
public:
void GetNickName() {printf("Base class\n");}
};
class CP45H3 : public CUsers{
public:
void GetNickName() {printf("P45H3\n");}
};
То компилятор скажет нам: "Это всё хуйня, переделывай".
В реализации задуманного нам помогут виртуальные методы.
Сделав метод в базовом классе виртуальным, мы сможем переопределять его
в любом производном классе.
Пример реализации задуманного
В реализации задуманного нам помогут виртуальные методы.
Сделав метод в базовом классе виртуальным, мы сможем переопределять его
в любом производном классе.
Пример реализации задуманного
Код:
#include <Windows.h>
#include <iostream>
class CUsers { //Базовы класс
public:
CUsers() {} //Конструктор
virtual void GetNickName() = 0; //Определение виртуального метода
virtual ~CUsers() {}; //Определение виртуального деструктора
};
class CP45H3 : public CUsers {//Производный класс
public:
CP45H3() {}
void GetNickName() override { printf_s("P45H3\n"); }//Переопределение виртуального метода
~CP45H3() {}
};
class CGOVARD : public CUsers {//Производный класс
public:
CGOVARD() {}
void GetNickName() override { printf_s("GOVARD\n"); }//Переопределение виртуального метода
~CGOVARD() {}
};
int main() {
SetConsoleTitle(" ");
CUsers* g_p45h3 = new CP45H3; //Инициализируем указатель на базовый класс производными
CUsers* g_govard = new CGOVARD;
g_p45h3->GetNickName(); //Вызов методов через указатель на базовый класс
g_govard->GetNickName();
delete g_p45h3;//Удаление объектов производных классов
delete g_govard;
return 0;
}[/SIZE]
В данном коде имеется один базовый класс и два
производных, которые переопределяют метод GetNickName().
Деструктор чисто виртуального класса также должен быть
виртуальным для корректного удаления объектов производных классов.
Скачать проект вы можете на моём GitHub'e
Пожалуйста, авторизуйтесь для просмотра ссылки.