Меня тут озадачили на одном собеседовании вопросом, как собственно реализуется наследование в c#.
Самому стало интересно, сейчас усиленно гуглю на эту тему, но пока понять ничего не смог.
Может кто поможет? Никто не задавался таким вопросом?
Здравствуйте, -n1l-, Вы писали:
N>Меня тут озадачили на одном собеседовании вопросом, как собственно реализуется наследование в c#. N>Самому стало интересно, сейчас усиленно гуглю на эту тему, но пока понять ничего не смог. N>Может кто поможет? Никто не задавался таким вопросом?
Может, как обычно, производный класс включает в себя все невиртуальные члены базового класса плюс таблицу виртуальных функций плюс ссылку нак объект типа?
Это было бы логично, довольно стандартная реализация.
Здравствуйте, -n1l-, Вы писали:
N>Меня тут озадачили на одном собеседовании вопросом, как собственно реализуется наследование в c#. N>Самому стало интересно, сейчас усиленно гуглю на эту тему, но пока понять ничего не смог. N>Может кто поможет? Никто не задавался таким вопросом?
У символа производного типа прописывается ссылка на символ базового. Подробности наглядно описаны в исходниках Roslyn.
Здравствуйте, -n1l-, Вы писали:
N>Меня тут озадачили на одном собеседовании вопросом, как собственно реализуется наследование в c#.
Тут вопрос надо уточнить. Потому что с точки зрения шарпа, с точки зрения il-метаданных, с точки зрения рантайма и с точки зрения бинарного кода ответы будут разные.
В максимально упрощённом виде всё стандартно: в заголовке объекта указатель на type info (ок, на method table на самом деле, но кто это помнит?). В method table хранятся все методы, определённые в самом классе и в его предках.
Дальше всё несложно (*под несложно — нюансов на пару статей, но снова, кто всё это помнит? ).
UPD. Основные моменты для CLR 2.0 собраны вот тут. Статья не без косяков, но в качестве стартовой точки пойдёт.
Здравствуйте, vmpire, Вы писали: V>Может, как обычно, производный класс включает в себя все невиртуальные члены базового класса плюс таблицу виртуальных функций плюс ссылку нак объект типа? V>Это было бы логично, довольно стандартная реализация.
На какой объект типа? Свой или базового класса? Или обоих? А как тогда разрешается ссылка если она базового а объект в ней подается производного?
Здравствуйте, -n1l-, Вы писали:
N>Здравствуйте, vmpire, Вы писали: V>>Может, как обычно, производный класс включает в себя все невиртуальные члены базового класса плюс таблицу виртуальных функций плюс ссылку нак объект типа? V>>Это было бы логично, довольно стандартная реализация. N>На какой объект типа? Свой или базового класса? Или обоих?
Свой V>> А как тогда разрешается ссылка если она базового а объект в ней подается производного?
Никак Ибо тут ничего разрешать не надо.
Производный класс имеет дополнительные поля к базовому, а значит, поля базового тоже имеет, на том же месте в том же порядке.
Поэтому его просто можно использовать там же, где и базовый без каких-то специальных действий.