Виртуальные методы C++

В игре Source SDK
Забаненный
Статус
Оффлайн
Регистрация
10 Янв 2017
Сообщения
2,148
Реакции[?]
806
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
В данной статье я расскажу про
виртуальные методы.

Виртуальный метод даёт возможность переопределения
метода в производном классе.


Представим ситуацию:
У нас есть класс 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
Пожалуйста, авторизуйтесь для просмотра ссылки.
 
Эксперт
Статус
Оффлайн
Регистрация
12 Июн 2014
Сообщения
991
Реакции[?]
1,209
Поинты[?]
3K
Чуть поправлю:
функция базового класса не константная, так что имеет смысл использовать override.
Код:
class CUsers
{
public:
    CUsers(){}
    virtual void GetNickName() = 0;
    virtual ~CUsers() {};
};


class CP45H3 :
    public CUsers {//Производный класс
public:
    CP45H3() {}
    virtual void GetNickName() override
    { printf_s("P45H3\n"); }//Переопределение виртуального метода
    ~CP45H3() {}
};

class CGOVARD : public CUsers {//Производный класс
public:
    CGOVARD() {}
    virtual void GetNickName() override 
       { printf_s("GOVARD\n"); }//Переопределение виртуального метода
    ~CGOVARD() {}
};
+ можно добавить, что новые стандарты советуют использовать более новую функцию printf_s вместо устаревшей printf
 
Сверху Снизу