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

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

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


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

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

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

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

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

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

Например класът на фигурата съдържа два виртуални метода, площ и периметър. Съответно vtbl на обекти от този клас съдържа два указателя.

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

Когато настъпи наследяване, данните на наследника се добавят към основния клас и vtbl се заменя с таблица с методи, заменени от наследника:

Например, помислете за следния клас:

В паметта обект от тип "кръг" ще изглежда така:

обекти

Както можете да видите, местоположението на данните на базовия клас вътре в детето е същото, както ако въобще няма детски клас - това е необходимо, за да може наследникът да се третира като основен клас.

Това е, няма магия и всичко е доста просто под капака на C++.

Малко допълнение: Стана интересно - колко команди са необходими, за да се извика виртуален метод. Ето какво се случи:

изглеждат

Не толкова страшно, то е напълно безплатно за използване.