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

Ребят, а как реализовано наследование в большинстве компиляторов? Есть такой линк,

но там многовато читать...
https://itanium-cxx-abi.github.io/cxx-abi/abi.html

Если говорить про виртуальные функции, то через virtual table, а наследование?
Можете, несколько терминов накинуть?

43 ответов

40 просмотров

Объект базового класса вкладывается в объект производного

класс базовый в начало кладется, потом производные

посмотри на степике курс про множественное наследование, там хорошо рассказывается или лекцию от CSC / владимирова

Это как раз в стандарте описано, а не в ABI

http://eel.is/c++draft/class.derived#general-3

Gleb-Pylypets Автор вопроса
Liber Azerate
Это как раз в стандарте описано, а не в ABI

Ааа, то есть стандартом определена реализация?

Gleb Pylypets
Ааа, то есть стандартом определена реализация?

Не то, как размещается в памяти, но то, как устроено, да

Gleb-Pylypets Автор вопроса
Yalokin Kononov
Он спросил как размещается в памяти

По-моему, нет. Это как раз зависит от ABI, опять же. То, что класс наследник содержит подобъект базового класса – не то, как оно размещается в памяти

Gleb Pylypets
Спс

у тебя есть кланг?

Gleb-Pylypets Автор вопроса
Yalokin Kononov
у тебя есть кланг?

Найти смогу, думаю

Yalokin Kononov
Он спросил как размещается в памяти

https://eel.is/c++draft/class.derived#general-3 https://eel.is/c++draft/class.derived#general-5

Gleb Pylypets
Спс

https://lms-vault.s3.amazonaws.com/private/1/courses/2020-autumn/spb-cpp-1/slides/cpp_1_lecture_101120.pdf?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAUKOEY5ZX6VXK3RWN%2F20210413%2Feu-central-1%2Fs3%2Faws4_request&X-Amz-Date=20210413T113944Z&X-Amz-Expires=10&X-Amz-SignedHeaders=host&X-Amz-Signature=5f3736612e4a9c63d794c064ddedb701398c82778e923f007e0071b0bd5294c6 глянь эту презентацию, тут есть флажок кланга как вывести layout класса и в целом все лейауты перечислены, можно пощупать самому

Gleb Pylypets
Ааа, то есть стандартом определена реализация?

стандарт в целом определяет лишь семантику языковых конструкций и требуемое наблюдаемое поведение корректной программы. это справедливо и для нашего случая тоже

Gleb-Pylypets Автор вопроса
Gleb Pylypets
Спасибо, почитаю

Но это может быть специфицировано: https://eel.is/c++draft/class.base.init#1

class A : public B так и реализовано

Yalokin Kononov
класс базовый в начало кладется, потом производные

На счёт "начала" я бы не надеялся... Да и где там в классе начало-то?

Liber Azerate
Но это может быть специфицировано: https://eel.is/...

что именно специфицируется, кроме непосредственно инициализаторов?

Vlad
что именно специфицируется, кроме непосредственно ...

Порядок, в котором аллоцируются подобъекты базовых классов

Liber Azerate
Порядок, в котором аллоцируются подобъекты базовых...

так вы же сами привели https://eel.is/c++draft/class.derived#general-5

Vlad
так вы же сами привели https://eel.is/c++draft/cla...

Да, я перепутал инициализацию и аллокацию

Gleb-Pylypets Автор вопроса
Ilya Zviagin
class A : public B так и реализовано

сложное пояснение Например, в пайтоне используется C3-линеаризация и через неё будет поиск имени нужного. Иными словами вопрос в том, как идёт поиск метода, переменной и т.д., если она не в этом классе, как расположены в памяти, что делает кастование на уровне этого расположения... Ну по С++ скинули выше, почитаю

Ilya Zviagin
На счёт "начала" я бы не надеялся... Да и где там ...

Ну это деталь реализации, но кланг такой лэйоут выдает. Начало согласен, понятие не очень: // main.cpp struct A { int a; }; struct B { int b; }; struct C : public A, public B { int c; }; int main() { C c; } clang -Xclang -fdump-record-layouts -c main.cpp Выдает следующее: Dumping AST Record Layout 0 | struct C 0 | struct A (base) 0 | int a 4 | struct B (base) 4 | int b 8 | int c | [sizeof=12, dsize=12, align=4, | nvsize=12, nvalign=4]

Gleb Pylypets
сложное пояснение Например, в пайтоне используетс...

Кастование в каком-то смысле сдвигает указатель куда нужно, а про порядок и C3-линеаризацию, в плюсах другой механизм, можешь посмотреть ту лекцию, что я скинул или почитать что скинул либер, там тоже довольно понятно все

Gleb Pylypets
сложное пояснение Например, в пайтоне используетс...

Интересует как ищутся методы базового класса?

Gleb-Pylypets Автор вопроса
Liber Azerate
Интересует как ищутся методы базового класса?

Ну да, как наследование работает internally.

Gleb Pylypets
сложное пояснение Например, в пайтоне используетс...

вы спрашиваете сразу про все, но вот раздел, который покроет часть ваших вопросов http://eel.is/c++draft/class.member.lookup

Serhii Herashchenko
через vtable

Это если про виртуальные функции

Gleb-Pylypets Автор вопроса
Vlad
вы спрашиваете сразу про все, но вот раздел, котор...

Ну да, хочу изучить вопрос, который звучит примерно так - "расскажите про реализацию наследования в большинстве компиляторов"😃

Gleb Pylypets
Ну да, хочу изучить вопрос, который звучит примерн...

Ну это всё же описывает стандарт. То, как лежат подобъекты базовых классов в памяти, – несущественно

Gleb Pylypets
Ну да, хочу изучить вопрос, который звучит примерн...

1) Правда же линеаризация нужна только при множественном наследовании? 2) правда же она нужна только если такой лукап не является ошибкой компиляции?

Liber Azerate
Ну это всё же описывает стандарт. То, как лежат по...

ну такое, при виртуальном наследовании там весьма хитрей лейоут и по-другому даже вроде как не сделать

Gleb Pylypets
++

вам нужен стандарт и все, что выше (cppref). исходники компиляторов не очень помогут

Aidar Fattakhov
1) Правда же линеаризация нужна только при множест...

В си++ является поэтому в вопросе нет смысла

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

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

а через ESC-код ?
Alexey Kulakov
29
30500 за редактор? )
Владимир
47
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
Вот еще странный косяк, подскажите как бороться. Я git clone сделал себе всего embassy и примеры там запускаю. Всё хорошо. Но вот решил в cargo.toml зависимости не как в приме...
Lukutin R2AJP
1
вы делали что-то подобное и как? может есть либы готовые? увидел картинку нокода, где всё линиями соединено и стало интересно попробовать то же в ddl на lua сделать. решил с ч...
Victor
8
Ребят в СИ можно реализовать ООП?
Николай
33
Карта сайта