понимание vptr в множественном наследовании?

Я пытаюсь разобраться в утверждении в книге «Эффективный C ++». Ниже приводится диаграмма наследования для множественного наследования.

enter image description here

enter image description here

Теперь в книге говорится, что для vptr требуется отдельная память в каждом классе. Также он делает следующее утверждение

. Необычность на приведенной выше диаграмме состоит в том, что существует только три vptr, хотя задействовано четыре класса. Реализации могут генерировать четыре vptr, если захотят, но трех достаточно (оказывается, что B и D могут совместно использовать vptr), и большинство реализаций используют эту возможность для уменьшения накладных расходов, создаваемых компилятором.

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

B и D могут совместно использовать vptr

Может кто-нибудь, пожалуйста, немного прояснить vptr при множественном наследовании?

  • Нам нужно отдельный vptr в каждом классе?
  • Также, если вышеизложенное верно, почему B и D могут совместно использовать vptr?
17
задан curiousguy 8 July 2018 в 18:01
поделиться