Схема хранения объектов polymorphi c в соответствии со стандартом C ++ - PullRequest
2 голосов
/ 17 марта 2020

Я знаю, что если класс содержит какие-либо виртуальные функции, большинство компиляторов (если не все) добавляют указатель vptr к своим объектам. Некоторые добавляют его как первый элемент, некоторые как последний. Но требует ли стандарт C ++ использование vptr и vtable? Может ли какой-либо компилятор теоретически реализовать его каким-либо другим способом? Если да, то каковы гарантии относительно структуры хранения полиморфных c объектов и общего размера (например, все ли явно определенные поля (+ заполнение) в непрерывном блоке памяти)?

Я не знаю, если это отличается между различными стандартами C ++, поэтому я добавил только общий тег C++.

1 Ответ

2 голосов
/ 17 марта 2020

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

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

[class.mi]

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

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

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

[class.virtual]

Если виртуальная функция-член vf объявлена ​​в классе Base и в классе Derived, полученном прямо или косвенно из Base ... [еще несколько требований] ... тогда Derived :: vf ... переопределяет Base :: vf.

Некоторые технические требования опущены. Стандарт просто указывает, что виртуальная функция в производном классе «переопределяет» (ту же) функцию в базовом классе. Как конкретная реализация C ++ делает это, нигде не указано.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...