170 похожих чатов

Здравствуйте. Вопрос про множественное наследование. Начну издалека: А-->В При одиночном наследовании сначала создается

обьект класса А вместе со всеми нужными штуками, как this и vfptr, а уже потом после объекта класса А записываются переменные объекта класса В. Благодаря этому возможно такое:

B b;
A* ptrA = &b;

Если объект класса А весит 20 байт, а обьект класса В весит 30байт, то указатель на А будет считывать первые 20 байт, где будут и vfptr, и this. То есть Aptr будет пользоваться служебными штуками объекта класса А.

А что происходит при множественном наследовании?:
A, B --> C
C c;
A* Aptr = &c;
B* Bptr = &c;
vfptr и this дублируются для каждого родителя или что?

P.s. Нашел код из википедии, но все равно остаются вопросы, как Bptr понимает, что при указании на обьект класса C надо сместиться на 8 байт от начала:
class B1 {
public:
void f0() {}
virtual void f1() {}
int int_in_b1;
};

class B2 {
public:
virtual void f2() {}
int int_in_b2;
};

class D : public B1, public B2
{
public:
void d() {}
void f2() {} // переопределяем B2::f2()
int int_in_d;
};

D *d = new D();
d:
+0: указатель на ТВМ D (для B1)
+4: значение int_in_b1
+8: указатель на ТВМ D (для B2)
+12: значение int_in_b2
+16: значение int_in_d

Общий размер: 20 байтов.

ТВМ D (для B1):
+0: B1::f1() // B1::f1() не переопределён

ТВМ D (для B2):
+0: D::f2() // B2::f2() замещён D::f2()

2 ответов

3 просмотра

ты почему-то считаешь, что указатель в C++ это просто число :) стандарт предполагает что это своего рода чёрный ящик

Niceguy- Автор вопроса
usernameak
ты почему-то считаешь, что указатель в C++ это про...

Ну просто адрес, где по типу, на который указывает указатель, компилятор сообщает, на сколько сместиться, чтобы считать *ptr(ну типа арифметика указателей)

Похожие вопросы

Обсуждают сегодня

А еще в перле можно уже @arr1 + @arr2?
Sergei Zhmylove
53
я не магистр хаскеля, но разве не может лейзи тип конвертнуться в не-лейзи запросив вычисление содержимого прям при инициализации?
deadgnom32 λ madao
100
Подскажите, где смотреть результат выполнения программы? Код: ;.686 ;Система команд процессора 686 ;.MODEL FLAT,stdcall ;Модель памяти плоская, станда...
Егор Анелькин
5
Привет всем. появился вопрос. Разрабатываю сайт, в данный момент он запущен. Хостинг beget. Добавляю на сайт яндекс метрику с помощью полей client-settings (взято отсюда http...
Andrew
2
Где в Астане можно купить мясо для шашлыков?
Dancing Іңұқәһүғө
21
Добрый день подскажите пожалуйста может кто то сталкивался с ошибками Sentry 22.10.0 развернутым из helm чарт в Kubernetes? Изначально 3 дня назад очень стало много событий ух...
Tire4 Finist Devops
1
;.686 ;Система команд процессора 686 ;.MODEL FLAT,stdcall ;Модель памяти плоская, стандартный ;вызов процедуры ;option casemap:no...
Егор Анелькин
1
почому оно не работает?
Vi Chapmann Chapmann
19
всем привет почти закончил курс После него можно писать свою операционку? Какие библиотеки надо использовать и куда дальше копать для изучения
Linus
19
Так а кто может спарсить всех участников чата? Идишники
Magic
18
Карта сайта