Чем отличается виртуальный вызов от виртуальной цепи

от admin

Протокол х.25/3.

Уровень 3 Рекомендации Х.25 МККТТ (Х.25/3) определяет виртуально-датаграмную сеть: «формат пакета и процедуры управления для обмена пакетами, содержащими информацию управления и данные пользователя». Он описывает требования, предъявляемые к двум элементам программной структуры сети: управление передачей и управление сетью. Х.25 однозначно определяет сетевой уровень.

В вычислительной сети одновременно создается много логических каналов. Х.25 описывает создание как временных (на один сеанс), так и постоянных логических каналов. Чаще всего постоянные соединения используются для связи хост-машин, а временные – для взаимодействия терминалов с большим числом хост-машин. Временное соединение в протоколе Х.25 называется виртуальным вызовом, а постоянное – виртуальной цепью. Любому виртуальному вызову либо виртуальной цепи присваивается номер группы логических каналов (от 0 до 15) или номер логического канала (от 0 до 255). Виртуальный вызов связан с проведением одного сеанса связи. Поэтому указанные номера приписываются любому сеансу связи и изменяются циклически. Виртуальная цепь существует постоянно. Поэтому номер этой цепи относится ко всем проводимым через нее сеансам связи.

Типы и форматы пакетов протокола х.25

Используемые типы пакетов приведены в таблице 4.

Установление соединения и разъединения

Входящий запрос соединения

Согласие на соединение

Подтверждение разъединения от сети

Подтверждение разъединения от абонента

Данные и прерывания

Данные от абонента

Прерывание от сети

Прерывание от абонента

Подтверждение прерывания от сети

Подтверждение прерывания от абонента

Управление потоком и сброс

Готовность сети к приему

Готовность абонента к приему

Неготовность сети к приему

Неготовность абонента к приему

Подтверждение сброса сетью

Подтверждение сброса абонентом

Подтверждение рестарта сетью

Подтверждение рестарта абонентом

Два из этих пакетов – Данные и Датаграмма – информационные, остальные – обеспечивают управление виртуально – датаграммной сетью и выполняет следующие функции:

— установление виртуального соединения;

— поддержание виртуального соединения;

— управление потоками пакетов;

— выполнение рестарта (повторная организация виртуального соединения);

— разъединение виртуального соединения.

DTE — абонентская машина

DSE — коммуникационная машина

Фаза сброса необходима для продолжения работы как временных, так и постоянных логических каналов после появления ошибок в транспортной сети: нарушение порядка последовательности пакетов, ошибки в процедуре управления, переполнение коммуникационной сети.

Фаза рестарта используется для восстановления после ошибок работы сразу всех логических каналов.

Два формата пакета «Данные».

Рис. 19 Формат пакета Х.25.

Рис. 20 Формат пакета Х.25 с расширенными полями счетчиков.

В левой половине 1 байта записывается идентификатор формата. В этом четырех битовом поле записывается код, указывающий на тип формата. Если пакеты Данные нумеруются циклически от 0 до 7 (модуль 8), то код 0001, если от 0 до 127 (модуль 128), то код 0010. Правая половина байта определяет номер группы логического канала. Во 2 байте – N логического канала, по которому необходимо передавать информацию.

В правом разряде 3 байта записывается 0 (нуль) выделяющий информационные пакеты, а также сигнальные пакеты датаграммного сервиса среди всех 19 пакетов. У остальных (управляющих) 16 пакетов в этом разряде проставлена 1.

N(S) – номер передаваемого пакета, N(R) – номер принимаемого (ожидаемого) пакета, М=1 означает, что пакет промежуточный, М=0 – пакет последний. Структура пакета Датаграмма при нумерации от 0 до 7 показана на рисунке. Если нумерация идет от 0 до 128, то 3 байт заменяется 2 байтами.

Рис. 21. Формат пакета «дейтаграмма» протокола Х.25.

Протокол Х.25 определяет размеры основы пакета в 16, 32, 64, 128, 256, 512 и 1024 байт. Основной размер – 128 байт.

Управляющие пакеты имеют такую же структуру (почти). Управляющие пакеты всегда передаются в виде датаграммы и любой управляющий пакет является командой для программ управления сетью, принимающей абонентской машины. В управляющих пакетах отсутствуют N(R) и N(S), а в этом байте (3) указывается идентификатор типа пакета.

Виртуальное соединение образуется следующим образом. Вызывающий абонент передает в сеть по свободному логическому каналу пакет «Запрос соединения», содержащий адрес вызываемого абонента, вызываемый абонент. Вызываемый абонент может не принять запрос. В этом случае он передает пакет «Запрос разъединения», в котором в начале причины разъединения может быть указано «номер занят». После этого вызываемый абонент не может использовать логический канал для получения пакета «Подтверждение разъединения». Если сеть не может установить соединение с вызываемым абонентом, вызывающему абоненту посылается пакет «Указание разъединения», содержащий причину разъединения: нереализованный вызов, номер занят, неразрешенный вызов, перегрузка сети и т.д. Если вызываемый абонент принимает запрос на соединение, он передает пакет «Согласие на соединение», после чего сеть посылает вызывающему абоненту пакет «Подтверждение соединения». Этим заканчивается фаза установления соединения между абонентами. Начиная устанавливать соединение, вызывающий абонент запускает таймер. Если в течение тайм-аута не поступил пакет «Подтверждение соединения», абонент передает пакет «Запрос разъединения», после чего процедура установления соединения может повторяться. После установления соединения начинается фаза передачи пакетов. Для ликвидации и сброса всех постоянных и временных виртуальных соединений, установленных с абонентом, используется процедура рестарта инициализации абонентом с помощью пакета «Запрос рестарта» и сетью – пакетом «Указание рестарта». При этом ликвидируются соединения, относящиеся ко всем логическим каналам абонента и стираются все пакеты. Передаваемые через эти соединения. Для восстановления потерянных пакетов используются средства более высокого уровня иерархии.

Для передачи срочных данных используются ненумерованные пакеты «Прерывание от сети» и «Прерывание от абонента», несущие в себе 1 байт данных о причине прерывания. Эти пакеты доставляются получателю независимо от состояния передачи нумерованных пакетов – даже тогда, когда пакеты данных не принимаются.

По окончании передачи происходит фаза разъединения с помощью соответствующих пакетов.

В заключении следует отметить, что протокол Х.25 является большим набором процедур, значительная часть которых в конкретной вычислительной сети может не использоваться. При применении протокола возникает много вопросов, связанных с управлением коммуникационной сетью, для дальнейшего их решения.

Разница между вызовом виртуальной функции и не виртуальной функции?

На самом деле это вопрос собеседования, я не могу понять ответа. Кто-нибудь знает об этом? Можно говорить о любых различиях, например, о данных, которые помещаются в стек.

5 ответов

Хотя виртуализм / динамическая диспетчеризация строго определяется реализацией, большинство (читайте все известные ) компиляторы реализуют это с помощью vptr и vtable .

При этом разница между вызовом не виртуальной функции и виртуальной функции заключается в следующем:

Невиртуальные функции разрешаются statically в Compile-time , а виртуальные функции разрешаются dynamically в Run-time .

Чтобы достичь такой гибкости, чтобы иметь возможность решать, какую функцию вызывать во время выполнения, в случае виртуальных функций возникают небольшие накладные расходы.

Дополнительный вызов fetch , который необходимо выполнить, и это накладные расходы / цена, которые вы платите за использование динамической отправки.

В случае невиртуальной функции последовательность вызовов следующая:

Компилятору необходимо fetch адрес функции, а затем call ее.

А в случае виртуальных функций последовательность такова:

Компилятору необходимо fetch vptr из this , затем fetch адрес функции из vptr , а затем call функцию .

Это просто упрощенное объяснение, фактическая последовательность может быть намного сложнее, чем эта, но это то, что вам действительно нужно знать. На самом деле не нужно знать подробности реализации.

Хорошо для чтения:

Если у вас есть базовый класс Base и производный класс Derived, и у вас есть функция func (), определенная как виртуальная в базовом классе. Эта функция переопределяется классом Derived.

Предположим, вы определили

Затем вызывается функция класса Derived. Хотя, если func () не был определен как виртуальный в Base, он будет вызываться из класса Base. В этом разница, чем отличается вызов функции для виртуальных и не виртуальных функций.

Невиртуальные функции-члены разрешаются статически. функции-члены статически привязываются во время компиляции в зависимости от типа указателя (или ссылки) на объект.

Напротив, виртуальные функции-члены связываются динамически во время выполнения . Если у класса есть хотя бы одна виртуальная функция-член, тогда компилятор помещает скрытый указатель в объект, называемый vptr (адрес виртуальной таблицы) во время создания объекта.

Компилятор создает v-таблицу для каждого класса , в котором есть хотя бы одна виртуальная функция. Виртуальная таблица содержит адрес виртуальной функции. Это может быть массив или список (в зависимости от компилятора) указателя виртуальной функции
Во время отправки виртуальной функции система времени выполнения следует за v-указателем объекта (извлекает адрес из объекта класса) в v-таблицу класса, затем к базовому адресу (vptr) добавляется смещение и вызывает функцию.

Накладные расходы space-cost вышеупомянутого метода являются номинальными: дополнительный указатель на объект (но только для объектов, которым необходимо выполнять динамическое связывание), плюс дополнительный указатель на каждый метод (но только для виртуальных методов. ). Накладные расходы затраты времени также довольно номинальны: по сравнению с обычным вызовом функции вызов виртуальной функции требует двух дополнительных выборок (одна для получения значения v-указателя, вторая для получения адреса метода).

Ни одно из этих действий времени выполнения не происходит с невиртуальными функциями, поскольку компилятор разрешает невиртуальные функции исключительно во время компиляции в зависимости от типа указателя.

Я взял простой пример, чтобы лучше понять, как происходит привязка невиртуальных функций и виртуальных функций и как работает механизм виртуальных функций.

Как создается виртуальная таблица для базового и производного классов

Код сборки создан для лучшего понимания.

Я получил информацию о vtable из virtual.s для базового и производного классов соответственно:

Как видите, fun и fun1 — это только две виртуальные функции в базовом классе. Vtable базового класса (_ZTV4Base) содержит записи обеих виртуальных функций. Vtable не имеет записи о невиртуальной функции. Пожалуйста, не путайте с названием fun (ZN4Base3funEv) и fun1 (ZN4Base4fun1Ev), их название было искажено.

Производный класс vtable имеет древовидные записи

  1. функция переопределения fun (_ZN7Derived3funEv)
  2. fun1 (_ZN4Base4fun1Ev) унаследованный от базового класса
  3. fun3 (_ZN7Derived4fun3Ev) новая функция в производном классе

Как вызывается не виртуальная функция и виртуальная функция?

для невиртуальных функций

Просто скажите, получите и вызовите get (привязка произошла во время компиляции)

для невиртуальных функций

Получить vptr, добавить смещение функции, вызвать функцию (привязка произошла во время выполнения)

Сборка 64 сбивает с толку большинство программистов на C ++, но если кто-то захочет обсудить, то добро пожаловать

Виртуальная трасса — Virtual circuit

Виртуальный канал ( ВК ) является средством транспортировки данные через сеть с коммутацией пакетов таким образом , что кажется , как будто есть выделенный физический канал св зи между источником и назначением систем конечных этих данных. Термин виртуальный канал является синонимом виртуального соединения . Виртуальный канал представляет собой тип виртуального канала.

Прежде чем можно будет использовать соединение или виртуальный канал, он должен быть установлен между двумя или более узлами или программными приложениями посредством установки вызова . После этого между узлами может быть доставлен поток битов или поток байтов ; следовательно, протокол виртуальной цепи позволяет протоколам более высокого уровня избегать разделения данных на блоки данных протокола .

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

Альтернативная конфигурация сети для виртуального канала — дейтаграмма .

Содержание

Сравнение с коммутацией цепи

Связь по виртуальным каналам напоминает коммутацию каналов , поскольку обе ориентированы на соединение , а это означает, что в обоих случаях данные доставляются в правильном порядке, и на этапе установления соединения требуются служебные данные. Однако коммутация каналов обеспечивает постоянную скорость передачи данных и задержку, хотя они могут варьироваться в службе виртуальных каналов из-за таких факторов, как:

  • различная длина очереди пакетов в узлах сети,
  • различная скорость передачи данных, генерируемая приложением,
  • различная нагрузка от других пользователей, совместно использующих одни и те же сетевые ресурсы, посредством статистического мультиплексирования и т. д.

Возможность виртуального звонка

В электросвязи возможность виртуального вызова , иногда называемая средством виртуального вызова , представляет собой служебную функцию, в которой:

  • вызов процедура настройки и процедура разъединения вызова определяет период связи между двумя устройствами DTE , в котором пользовательские данные передаются с помощью пакетной коммутации сети
  • от конца до конца передачи управления пакетами в пределах сети требуется
  • данные могут быть доставлены в сеть отправителем вызова до завершения фазы доступа к вызову , но данные не доставляются получателю вызова, если попытка вызова не удалась
  • сеть доставляет все пользовательские данные приемнику вызова в той же последовательности, в которой данные принимаются сетью
  • DTES с множественным доступом может иметь несколько виртуальных текущих вызовов в то же время .

Альтернативной сетевой конфигурацией виртуальных вызовов является связь без установления соединения с использованием дейтаграмм .

Виртуальные каналы уровня 4

Протоколы транспортного уровня, ориентированные на соединение, такие как TCP, могут полагаться на протокол сетевого уровня с коммутацией пакетов без установления соединения, такой как IP , где разные пакеты могут маршрутизироваться по разным путям и, таким образом, доставляться не по порядку. Однако можно использовать TCP в качестве виртуального канала, поскольку TCP включает в себя нумерацию сегментов, которая позволяет переупорядочивать на стороне получателя для обеспечения доставки вне очереди.

Виртуальные каналы уровня 2/3

Протоколы уровня канала передачи данных и виртуального канала сетевого уровня основаны на коммутации пакетов с установлением соединения , что означает, что данные всегда доставляются по одному и тому же сетевому пути, то есть через одни и те же узлы. Преимущества перед коммутацией пакетов без установления соединения:

  • Поддерживается резервирование полосы пропускания на этапе установления соединения, что делает возможным гарантированное качество обслуживания (QoS). Например, может быть обеспечен класс QoS с постоянной скоростью передачи данных , что приводит к эмуляции переключения каналов .
  • Требуется меньше служебных данных, поскольку пакеты не маршрутизируются индивидуально, а полная адресная информация не предоставляется в заголовке каждого пакета данных. В каждом пакете требуется только небольшой идентификатор виртуального канала (VCI). Информация о маршрутизации передается узлам сети только на этапе установления соединения.
  • Сетевые узлы быстрее и имеют более высокую пропускную способность теоретически, поскольку они представляют собой коммутаторы, которые выполняют маршрутизацию только на этапе установления соединения, а сетевые узлы без установления соединения — это маршрутизаторы, которые выполняют маршрутизацию для каждого пакета индивидуально. Переключение предполагает только поиск идентификатора виртуального канала в таблице, а не анализ полного адреса. Коммутаторы могут быть легко реализованы в оборудовании ASIC , тогда как маршрутизация более сложна и требует программной реализации. Однако из-за большого рынка IP-маршрутизаторов и из-за того, что современные IP-маршрутизаторы поддерживают коммутацию уровня 3 , современные IP-маршрутизаторы сегодня могут быть быстрее коммутаторов для протоколов с установлением соединения.
Читать:
Как скопировать таблицу из википедии

Примеры протоколов, которые предоставляют виртуальные каналы

Примеры протоколов транспортного уровня, которые обеспечивают виртуальный канал:

  • Протокол управления передачей (TCP), в котором надежный виртуальный канал устанавливается поверх базового ненадежного протокола IP без установления соединения. Виртуальный канал идентифицируется парой адресов сетевого сокета источника и получателя , то есть IP-адресом отправителя и получателя и номером порта. Гарантированного QoS не предусмотрено.
  • Протокол передачи управления потоком (SCTP), при котором виртуальный канал устанавливается поверх протокола IP.

Примеры протоколов виртуальных цепей сетевого уровня и уровня канала передачи данных, где данные всегда доставляются по одному и тому же пути:

  • X.25 , где VC идентифицируется идентификатором виртуального канала (VCI). X.25 обеспечивает надежную межузловую связь и гарантированное качество обслуживания.
  • Frame Relay , где VC идентифицируется с помощью DLCI. Ретрансляция кадров ненадежна, но может обеспечить гарантированное QoS.
  • Асинхронный режим передачи (ATM), в котором канал идентифицируется парой идентификатора виртуального пути (VPI) и идентификатора виртуального канала (VCI). Уровень ATM обеспечивает ненадежные виртуальные каналы, но протокол ATM обеспечивает надежность через подуровень конвергенции специфической услуги (SSCS) уровня адаптации ATM (AAL) (хотя в нем используются термины «гарантированный» и «ненадежный», а не «надежный» и «ненадежный»).
  • Общие услуги пакетной радиосвязи (GPRS)
  • Многопротокольная коммутация по меткам (MPLS), которая может использоваться для IP по виртуальным каналам. Каждая цепь обозначена этикеткой. MPLS ненадежен, но обеспечивает восемь различных классов QoS.

Постоянные и коммутируемые виртуальные каналы в ATM, Frame Relay и X.25

Коммутируемые виртуальные каналы ( SVC ) обычно устанавливаются для каждого вызова и отключаются, когда вызов завершается; тем не менее, постоянный виртуальный канал ( PVC ) может быть установлен в качестве опции для предоставления выделенного канала связи между двумя объектами. Конфигурация PVC обычно предварительно настраивается поставщиком услуг. В отличие от SVC, PVC обычно очень редко ломаются / отключаются.

Коммутируемый виртуальный канал (SVC) — это виртуальный канал, который динамически устанавливается по запросу и отключается, когда передача завершена, например, после телефонного звонка или загрузки файла. SVC используются в ситуациях, когда передача данных является спорадической и / или не всегда между одними и теми же конечными точками оконечного оборудования данных ( DTE ).

Постоянный виртуальный канал (PVC) — это виртуальный канал, установленный для многократного / непрерывного использования между одним и тем же DTE . В PVC долговременная ассоциация идентична фазе передачи данных виртуального вызова . Постоянные виртуальные каналы устраняют необходимость повторной установки и сброса вызовов .

  • Frame Relay обычно используется для предоставления PVC.
  • ATM обеспечивает как коммутируемые виртуальные соединения, так и постоянные виртуальные соединения , как они называются в терминологии ATM.
  • X.25 обеспечивает как виртуальные вызовы, так и PVC, хотя не все поставщики услуг X.25 или реализации DTE поддерживают PVC, поскольку их использование было гораздо реже, чем SVC.

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

  • Идентификатор соединения канала передачи данных (DLCI)

Ссылки

  • Эта статья включает материалы,являющиесяобщественным достоянием, из документа Управления общих служб : «Федеральный стандарт 1037C» .

Во-первых, виртуальная функция для достижения полиморфизма

Если вы хотите, чтобы поведение одного и того же метода в производном классе и базовом классе было разным, то есть поведение одного и того же метода зависит от контекста, это поведение называется множественным с несколькими формами.

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

  • Переопределите метод базового класса в производном классе.
  • Используйте виртуальные методы.

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

Существующий родительский класс Brass и производный класс BrassPlus

1.2 Звонок по объекту

Объект определяет, какой метод использовать.

1.3 Звоните по ссылке или по указателю

Если метод вызывается ссылкой или указателем, а не объектом, он определяет, какой метод использовать.

1.3.1 Использование ключевого слова virtual

Если используется виртуальный, программа выберет метод в зависимости от типа объекта, на который указывает ссылка или указатель.
Тип ссылки — Brass, но b2_ref ссылается на объект BrassPlus, поэтому используется BrassPlus :: ViewAcct (). При использовании медных указателей вместо ссылок поведение будет аналогичным.

1.3.2 Ключевое слово virtual не используется

Если ключевое слово virtual не используется, программа выберет метод на основе ссылочного типа или типа указателя.
Тип ссылочной переменной — Brass, поэтому был выбран Brass :: ViewAcct (). При использовании медных указателей вместо ссылок поведение будет аналогичным.

1.4 Реализация полиморфизма

Предполагая, что вы хотите одновременно управлять учетными записями Brass и BrassPlus, было бы полезно, если бы вы могли использовать один и тот же массив для сохранения объектов Brass и BrassPlus, но это невозможно.Все элементы в массиве должны быть одного типа, а Brass и BrassPlus — разных типов.

Однако ** может создать массив указателей на Брасса. Таким образом, тип каждого элемента одинаков, но поскольку используется модель открытого наследования, указатель Brass может указывать либо на объект Brass, либо на объект BrassPlus. ** Следовательно, массив может использоваться для представления нескольких типов объектов. Это полиморфизм.

Если член массива указывает на объект Brass, вызовите Brass :: ViewAcct (), если он указывает на объект BrassPlus, вызовите BrassPlus :: ViewAcct (). Если Brass :: ViewAcct (); не объявлен как виртуальный, то Brass :: ViewAcct () будет вызван в любом случае.

Два, виртуальная функция для достижения динамического связывания

2.1 Динамическая ссылка

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

2.2 Принудительное преобразование вверх

В общем, C ++ не позволяет присваивать адреса одного типа указателям другого типа, а также не позволяет ссылкам одного типа указывать на другой тип:

Однако ссылка или указатель на базовый класс могут ссылаться на объект производного класса без явного преобразования типа. следующим образом:

Преобразование ссылки или указателя на производный класс в ссылку на базовый класс или указатель называется апкастингомЧто исключает необходимость явного преобразования типов для публичного наследования. Это правило является частью отношений. Все объекты BrassPlus являются объектами Brass, поскольку они наследуют все элементы данных и функции-члены объекта Brass. Следовательно, операции, которые могут быть выполнены над объектом Brass, применимы к объекту BrassPlus.

2.3 Downcast

Противоположный процесс,Преобразовать указатель базового класса или ссылку на указатель производного класса или ссылочный вызов downcasting, Если вы не используете явное преобразование типов, даункатинг не допускается Причина в том, что отношения обычно необратимы.

2.4 Функции виртуальных членов и динамическое связывание

Для вызовов функций, которые используют ссылки на базовый класс или указатели в качестве параметров, выполняется повышающее преобразование. Предположим, что каждая из следующих функций вызывает виртуальный метод ViewAcct ():

Передача по значению приводит к тому, что в функцию fv () передается только часть Brass объекта BrassPlus. Но неявное преобразование с помощью ссылок и указателей заставляет функции fr () и fp () использовать Brass :: ViewAcct () и BrassPlus :: ViewAcct () для объекта Brass и объекта BrassPlus соответственно.

В-третьих, использование виртуальных функций стоимости

При использовании виртуальных функций существуют определенные затраты с точки зрения памяти и скорости выполнения, в том числе:

  • Каждый объект будет увеличиваться на величину адресного пространства хранилища
    (добавьте скрытый элемент к каждому объекту, и указатель на массив адресов функций будет сохранен в скрытом элементе);
  • Для каждого класса компилятор создает таблицу адресов виртуальных функций (массив)
    (Вышеуказанный элемент скрытого указателя указывает на таблицу виртуальных функций);
  • Для каждого вызова функции необходимо выполнить дополнительную операцию, то есть найти адрес в таблице.

4. Примечания о виртуальных функциях

  • Используйте ключевое слово virtual в объявлении метода базового класса, чтобы сделать метод виртуальным в базовом классе и во всех производных классах (включая классы, производные от производного класса).
  • Если вы используете ссылку или указатель на объект для вызова виртуального метода, программа будет использовать метод, определенный для типа объекта, вместо метода, определенного для ссылки или типа указателя. Это называется динамическим связыванием или поздним связыванием. Это поведение очень важно, потому что указатель или ссылка базового класса могут указывать на объект производного класса.
  • Если определенный класс должен использоваться в качестве базового класса, те методы класса, которые должны быть переопределены в производном классе, должны быть объявлены как виртуальные.

4.1 Конструктор

Конструктор не может быть виртуальной функцией. При создании объекта производного класса будет вызываться конструктор производного класса вместо конструктора базового класса. Затем конструктор производного класса будет использовать конструктор базового класса, этот порядок отличается от механизма наследования. Следовательно, производный класс не наследует конструктор базового класса, поэтому нет смысла объявлять конструктор класса как виртуальный.

4.2 Разрушитель

Деструктор должен быть виртуальной функцией, если класс не используется в качестве базового класса. Например, предположим, что Employee — это базовый класс, а Singer — производный класс, и добавьте элемент char *, который указывает на память, выделенную новым. Когда срок действия объекта Singer истекает, для освобождения памяти должен быть вызван деструктор

Если используется статическая привязка по умолчанию, оператор delete вызовет деструктор

Employee (). Это освободит память, на которую указывает часть Employee объекта Singer, но не освободит память, на которую указывает новый член класса.

Но если деструктор является виртуальным, он сначала вызовет деструктор

Singer (), чтобы освободить память, на которую указывает компонент Singer, а затем вызовет деструктор

Employee (), чтобы освободить память, на которую указывает компонент Employee.

Следовательно, использование виртуального деструктора может гарантировать, что вызывается правильная последовательность деструкторов.

Обычно виртуальный деструктор должен быть предоставлен базовому классу, даже если он не требует деструктора.

4.3 Друзья

Друзья не могут быть виртуальными функциями, потому что друзья не являются членами класса, и только участники могут быть виртуальными функциями. Если по этой причине возникает проблема проектирования, ее можно решить, разрешив функции-другу использовать виртуальные функции-члены.

4.4 Нет переопределения

Если производный класс не переопределяет функцию, будет использоваться версия функции базового класса. Если производный класс находится в производной цепочке, будет использоваться последняя версия виртуальной функции, за исключением того, что версия базового класса скрыта.

4.5 Переопределить скрытый метод

Метод переопределения наследования не перегружен. Если вы переопределите функцию в производном классе, вы не просто перезапишете объявление базового класса тем же списком параметров функции, независимо от того, совпадает ли список параметров, эта операция скроет все методы базового класса с одинаковым именем.

Это приводит к двум эмпирическим правилам:
Во-первых, если вы переопределите унаследованный метод, вы должны убедиться, что он в точности совпадает с исходным прототипом, но если возвращаемый тип является ссылкой или указателем базового класса, вы можете изменить его на ссылку на производный класс или указатель. Эта характеристика называетсяКовариантность типа возврата, Потому что тип возвращаемого значения может быть изменен с изменением типа:

Обратите внимание, что это исключение применяется только к возвращаемым значениям, а не к параметрам.

Во-вторых, если объявление базового класса перегружено, все версии базового класса должны быть переопределены в производном классе.

Если переопределена только одна версия, две другие версии будут скрыты, и объекты производного класса не смогут их использовать.
Обратите внимание, что если никаких изменений не требуется, новое определение может вызывать только версию базового класса:

Похожие статьи