РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
679 of 815 menu

Ключевое слово virtual

Ключевое слово virtual применяется в объявлении метода класса и сообщает компилятору, что этот метод может быть переопределён в производном классе. При вызове такого метода через указатель или ссылку на базовый класс будет вызвана версия метода того класса, на объект которого реально указывает указатель. Также virtual используется при наследовании классов для решения проблемы ромбовидного наследования.

Синтаксис

// Виртуальный метод в классе virtual return_type method_name(params); // Чисто виртуальный метод (абстрактный класс) virtual return_type method_name(params) = 0; // Виртуальное наследование class Derived : virtual public Base { };

Пример

Давайте создадим базовый класс Animal с виртуальным методом sound и два производных класса, которые переопределяют этот метод:

#include <iostream> using namespace std; class Animal { public: virtual void sound() { cout << "Some sound" << endl; } }; class Dog : public Animal { public: void sound() override { cout << "Woof" << endl; } }; class Cat : public Animal { public: void sound() override { cout << "Meow" << endl; } }; int main() { Animal* a1 = new Dog(); Animal* a2 = new Cat(); a1->sound(); a2->sound(); delete a1; delete a2; return 0; }

Результат выполнения кода:

"Woof" "Meow"

Пример

Без ключевого слова virtual вызов метода через указатель на базовый класс всегда приводил бы к вызову метода базового класса. Сравните поведение:

#include <iostream> using namespace std; class Base { public: void show() { cout << "Base" << endl; } }; class Derived : public Base { public: void show() { cout << "Derived" << endl; } }; int main() { Base* b = new Derived(); b->show(); delete b; return 0; }

Результат выполнения кода:

"Base"

Если бы метод show в классе Base был объявлен как virtual, результат был бы "Derived".

Пример

Ключевое слово virtual также используется при виртуальном наследовании, чтобы избежать дублирования базового класса в иерархии:

#include <iostream> using namespace std; class A { public: int x = 10; }; class B : virtual public A { }; class C : virtual public A { }; class D : public B, public C { }; int main() { D d; d.x = 42; cout << d.x << endl; return 0; }

Результат выполнения кода:

42

Смотрите также

  • ключевое слово override,
    которое явно указывает на переопределение виртуального метода
  • ключевое слово pure virtual,
    которое создаёт чисто виртуальный метод
  • ключевое слово virtual inheritance,
    которое решает проблему ромбовидного наследования
  • ключевое слово abstract,
    которое описывает абстрактные классы
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить