время компиляции наследования или время выполнения? - PullRequest
3 голосов
/ 11 января 2012

В c ++ наследование происходит во время выполнения или во время компиляции?

Примеры?

Ответы [ 4 ]

6 голосов
/ 11 января 2012

В C ++ наследование само по себе ( без полиморфизма ) является функцией времени компиляции . В скомпилированном коде будет мало или нет различий между

struct foo : bar {};

и

struct foo { bar b; };

За исключением смещений для доступа к своим членам, не будет никаких "знаний" о том, как bar относится к foo в скомпилированном двоичном файле.


Это отличается, однако, при добавлении полиморфизма (т. Е. virtual функций, позволяющих dynamic_cast<>()) к изображению. Это позволяет позднее связывание : какая именно функция будет вызвана, определяется во время выполнения. Конечно, для этого требуются структуры данных (обычно с использованием так называемых виртуальных таблиц ), и эти структуры данных доступны во время выполнения , чтобы определить какую функцию вызывать.

Кроме того, virtual базовые классы требуют поддержки во время выполнения для доступа к ним в рамках производных объектов.


Если вас интересуют затраты времени выполнения некоторых функций C ++, вы можете попытаться получить копию Внутри объектной модели C ++ Стэнли Липпман. Это старая книга, но если вы хотите узнать, как обычно реализуются виртуальные функции-члены и как базовые объекты обычно размещаются в памяти в сценарии с множественным наследованием, и как все это влияет на производительность, то здесь вы найдете подробные обсуждения из таких тем.

3 голосов
/ 11 января 2012

Проще говоря,

Ключевое слово virtual указывает, должен ли компилятор или среда выполнения выполнять подъем.

0 голосов
/ 11 января 2012

Существуют методы, которые реализуют наследование как во время компиляции, так и во время выполнения.

0 голосов
/ 11 января 2012

Это зависит от того, что вы подразумеваете под "происходит" ... это определяется во время компиляции, но выполняется во время выполнения (vtables и т. Д.).

...