но там многовато читать...
https://itanium-cxx-abi.github.io/cxx-abi/abi.html
Если говорить про виртуальные функции, то через virtual table, а наследование?
Можете, несколько терминов накинуть?
Объект базового класса вкладывается в объект производного
класс базовый в начало кладется, потом производные
посмотри на степике курс про множественное наследование, там хорошо рассказывается или лекцию от CSC / владимирова
Это как раз в стандарте описано, а не в ABI
http://eel.is/c++draft/class.derived#general-3
Ааа, то есть стандартом определена реализация?
Не то, как размещается в памяти, но то, как устроено, да
Он спросил как размещается в памяти
По-моему, нет. Это как раз зависит от ABI, опять же. То, что класс наследник содержит подобъект базового класса – не то, как оно размещается в памяти
у тебя есть кланг?
Найти смогу, думаю
https://eel.is/c++draft/class.derived#general-3 https://eel.is/c++draft/class.derived#general-5
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 класса и в целом все лейауты перечислены, можно пощупать самому
стандарт в целом определяет лишь семантику языковых конструкций и требуемое наблюдаемое поведение корректной программы. это справедливо и для нашего случая тоже
Спасибо, почитаю
Но это может быть специфицировано: https://eel.is/c++draft/class.base.init#1
class A : public B так и реализовано
На счёт "начала" я бы не надеялся... Да и где там в классе начало-то?
что именно специфицируется, кроме непосредственно инициализаторов?
Порядок, в котором аллоцируются подобъекты базовых классов
так вы же сами привели https://eel.is/c++draft/class.derived#general-5
Да, я перепутал инициализацию и аллокацию
сложное пояснение Например, в пайтоне используется C3-линеаризация и через неё будет поиск имени нужного. Иными словами вопрос в том, как идёт поиск метода, переменной и т.д., если она не в этом классе, как расположены в памяти, что делает кастование на уровне этого расположения... Ну по С++ скинули выше, почитаю
Ну это деталь реализации, но кланг такой лэйоут выдает. Начало согласен, понятие не очень: // 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]
Прикольно выглядит.
Кастование в каком-то смысле сдвигает указатель куда нужно, а про порядок и C3-линеаризацию, в плюсах другой механизм, можешь посмотреть ту лекцию, что я скинул или почитать что скинул либер, там тоже довольно понятно все
Интересует как ищутся методы базового класса?
Ну да, как наследование работает internally.
https://eel.is/c++draft/basic.lookup#class.member.lookup-2
вы спрашиваете сразу про все, но вот раздел, который покроет часть ваших вопросов http://eel.is/c++draft/class.member.lookup
Это если про виртуальные функции
Ну да, хочу изучить вопрос, который звучит примерно так - "расскажите про реализацию наследования в большинстве компиляторов"😃
где реализация — это механизм работы?
Ну это всё же описывает стандарт. То, как лежат подобъекты базовых классов в памяти, – несущественно
1) Правда же линеаризация нужна только при множественном наследовании? 2) правда же она нужна только если такой лукап не является ошибкой компиляции?
ну такое, при виртуальном наследовании там весьма хитрей лейоут и по-другому даже вроде как не сделать
вам нужен стандарт и все, что выше (cppref). исходники компиляторов не очень помогут
В си++ является поэтому в вопросе нет смысла
Обсуждают сегодня