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 ответов

14 просмотров

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

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

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

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

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

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Гайс, вопрос для разносторонее развитых: читаю стрим с юарта, нада выделять с него фреймы с определенной структурой, если ли чо готовое, или долбаться с ринг буффером? нада у...
Vitaly
9
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
длина пакета фиксированная, или меняется?
Okhsunrog
7
Карта сайта