2012-01-11 3 views
3

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

Примеры?

+1

Ваш вопрос не имеет смысла. – SLaks

+3

Меня спрашивали об этом в интервью? – haris

+1

Возможно, вы захотите упомянуть такие вещи, как в следующий раз. Люди, как правило, не ценят это, когда у кажущихся сомнений придумывают не очень умные (некорректно) вопросы без всякой видимой причины.«Меня спросили об этом в одном из интервью, и, к моему удивлению, я не мог понять, что они намеревались», из этого выйдет проблема. – sehe

ответ

0

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

+1

Фактически, виртуальные таблицы являются механизмом реализации полиморфизма, и вы можете иметь наследование без полиморфизма. – sbi

+1

Ничего не существует во время выполнения, если нет ключевого слова 'virtual' где-то где-то. Ответ неверен и вводит в заблуждение. –

-1

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

+0

Упоминайте, как это сделать? –

+0

@Dead: У этого есть тег C++. – sbi

2

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

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

6

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

struct foo : bar {}; 

и

struct foo { bar b; }; 

для коррекций Кроме доступа к своим членам, не будет никакого «знания» о том, как bar относится к foo в скомпилированном двоичном файле.


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

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


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

+0

вы можете обосновать свой ответ. – haris

+0

Apt to add Nothing - это время выполнения, если не существует ключевого слова 'virtual', где-то даже в случае наследования. –

+0

@Als: Это кажется слишком широким для меня. Цикл 'for', безусловно, является чистой функцией времени исполнения, несмотря на то, что он не является виртуальным. – sbi