Виртуальный класс
В объектно-ориентированном программировании виртуальный базовый класс — это вложенный внутренний класс , функции и переменные-члены которого могут переопределяться и переопределяться подклассами внешнего класса. [1] Виртуальные классы аналогичны виртуальным функциям .
Тип времени выполнения виртуального класса зависит от типа времени выполнения объекта внешнего класса. (Точно так же, как тип объекта во время выполнения решает, какую виртуальную функцию следует использовать.)
Тип экземпляра времени выполнения объекта внешнего класса не только определяет полиморфный тип своего собственного объекта типа, но также и все генеалогическое древо членов виртуального класса.
Цель
[ редактировать ]Виртуальные классы решают проблему расширяемости , расширяя абстракцию данных новыми функциями и представлениями. Как и виртуальные функции, виртуальные классы следуют тем же правилам определения, переопределения и ссылки. [2]
Когда производный класс наследует базовый класс, он должен определить или переопределить виртуальные внутренние классы, унаследованные от базового класса. На объект дочернего класса можно ссылаться по ссылке или указателю типа родительского класса или типа дочернего класса. Когда ссылка или указатель вызывают виртуальные внутренние классы, будет вызвана реализация производного класса, если объект относится к типу производного класса. Тип внешнего класса определяет время выполнения внутреннего виртуального класса.
Метод с аргументом объекта имеет доступ к виртуальным классам объекта. Метод может использовать виртуальные классы своих аргументов для создания экземпляров и объявления переменных. Виртуальные классы разных экземпляров несовместимы.
Пример
[ редактировать ]Например, базовый класс Machine
мог бы быть виртуальный класс Parts
. Подкласс Car
реализовал бы Parts
иначе, чем подкласс Bicycle
, но программист может вызывать любые методы виртуального внутреннего класса Parts
в любом классе Machine
объект и получить Parts
реализация этого конкретного производного класса.
#include <iostream>
class Machine {
public:
void run() { }
class Parts {
public:
virtual int get_wheels() = 0;
virtual std::string get_fuel_type() = 0;
};
};
// The inner class "Parts" of the class "Machine" may return the number of wheels the machine has.
class Car: Machine {
public:
void run() {
std::cout << "The car is running." << std::endl;
}
class Parts: Machine::Parts {
public:
int get_wheels() override {
std::cout << "A car has 4 wheels." << std::endl;
return 4;
}
std::string get_fuel_type() override {
std::cout << "A car uses gasoline for fuel." << std::endl;
return "gasoline";
}
};
};
Любой объект типа класса Machine
можно получить доступ таким же образом. Программист может запросить количество колес (вызвав get_wheels()
), без необходимости знать, что это за машина, сколько у нее колес или все возможные типы машин. Такие функции, как get_fuel_type()
можно добавить в виртуальный класс Parts
по производному классу Car
.
См. также
[ редактировать ]- Наследование (объектно-ориентированное программирование)
- Суперкласс (информатика)
- Виртуальное наследование
- Виртуальная функция
Ссылки
[ редактировать ]- ^ «Виртуальные занятия» . Руководство по программированию CaesarJ . Технический университет Дармштадта. 10 февраля 2006 г. Проверено 30 июля 2007 г.
- ^ «Обзор виртуальных классов» (PDF) . Исчисление виртуальных классов . Университет Орхуса, Дания. 2006 год . Проверено 30 апреля 2014 г.
Внешние ссылки
[ редактировать ]- Альтерр, Филипп; Кремет, Винсент (2005). «Внутренние классы и виртуальные типы» (PDF) . Федеральная политехническая школа Лозанны (EPFL), Швейцария . Проверено 30 апреля 2014 г.
- Эрнст, Эрик; Остерманн, Клаус; Кук, Уильям Р. (2006). «Исчисление виртуальных классов» (PDF) . Университет Орхуса . Проверено 30 июля 2007 г.