Как изглеждат полиморфните обекти в паметта

Някога се интересувах как C ++ обектите се намират в паметта, но бързият google не намери нищо. Наскоро попаднах на статия по темата и мисля, че тя може да помогне на хора като мен. Това е нейният безплатен превод.

полиморфните

Начинът, по който абстрактните и абстрактните обекти са представени в паметта, е малко по-различен. Нека напишем няколко класа 2D форми като пример: кръг, правоъгълник и триъгълник. Всички те ще бъдат наследени от основния клас фигура "shape", който определя свойства, общи за всички фигури - позиция, цвят на контура и цвят на запълване.

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

Код на базовия клас:

Ако класът на фигурата не съдържа виртуални методи, тогава паметта, разпределена за обекти от този тип, ще съдържа само данни:

полиморфните

В нашия пример има виртуални методи. За да реализира полиморфизъм, компилаторът C ++ добавя указател към виртуална функционална таблица, наречена vtbl. Този указател се нарича vptr. Естествено, компилаторът C ++ създава само vtbl и vptr, когато е необходимо.