Jump to content

Виртуальный класс

В объектно-ориентированном программировании виртуальный базовый класс — это вложенный внутренний класс , функции и переменные-члены которого могут переопределяться и переопределяться подклассами внешнего класса. [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.

См. также

[ редактировать ]
  1. ^ «Виртуальные занятия» . Руководство по программированию CaesarJ . Технический университет Дармштадта. 10 февраля 2006 г. Проверено 30 июля 2007 г.
  2. ^ «Обзор виртуальных классов» (PDF) . Исчисление виртуальных классов . Университет Орхуса, Дания. 2006 год . Проверено 30 апреля 2014 г.
[ редактировать ]
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 9a5f9dce9f3112d389d1b1dcf0a37fc7__1689460980
URL1:https://arc.ask3.ru/arc/aa/9a/c7/9a5f9dce9f3112d389d1b1dcf0a37fc7.html
Заголовок, (Title) документа по адресу, URL1:
Virtual class - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)