Подписывайтесь на наш Telegram и не пропускайте важные новости! Перейти

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

  • Автор темы Автор темы P45H3
  • Дата начала Дата начала
В игре Source SDK
Забаненный
Забаненный
Статус
Оффлайн
Регистрация
10 Янв 2017
Сообщения
2,188
Реакции
806
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
В данной статье я расскажу про
виртуальные методы.

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


Представим ситуацию:
У нас есть класс CUsers имеющий метод
GetNickName() , а также производный класс CP45H3 в котором нам
нужно переопределить метод GetNickName().
Если мы опишем такой код:
Код:
Expand Collapse Copy
class CUsers{
public:
void GetNickName() {printf("Base class\n");}
};
class CP45H3 : public CUsers{
public:
void GetNickName() {printf("P45H3\n");}
};
То компилятор скажет нам: "Это всё хуйня, переделывай".

В реализации задуманного нам помогут виртуальные методы.
Сделав метод в базовом классе виртуальным, мы сможем переопределять его
в любом производном классе.
Пример реализации задуманного
Код:
Expand Collapse Copy
#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]

735a62c477f7.png

В данном коде имеется один базовый класс и два

производных, которые переопределяют метод GetNickName().
Деструктор чисто виртуального класса также должен быть
виртуальным для корректного удаления объектов производных классов.

Скачать проект вы можете на моём GitHub'e
Пожалуйста, авторизуйтесь для просмотра ссылки.
 
Чуть поправлю:
функция базового класса не константная, так что имеет смысл использовать override.
Код:
Expand Collapse Copy
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
 
Назад
Сверху Снизу