Наследование фиксирует отношения "есть". Учитывая контекст вашего вопроса, следующее не очень разумно:
class directory : public file
То, что имена каталогов и файлов имеют имена, не означает, что directory "is a" file
. Также было бы неуместно говорить, что file "is a" directory
.
Есть много других аргументов, которые вы могли бы здесь использовать. Например, вы можете утверждать, что как файлы, так и каталоги являются случаями thing_that_has_a_name
:
class thing_that_has_a_name {
std::string name;
/* ... */
};
class file : public thing_that_has_a_name {
/* ... */
};
class directory : public thing_that_has_a_name {
std::vector<file*> entries;
/* ... */
};
(Это один из способов решения этой проблемы, но наследование является довольно сложным механизмом. Если вы создаете базовые классы для таких вещей, как абстрактная концепция «иметь имя», то вы быстро обнаружите, что вам нужно наследовать от нескольких базовых классов.)
Чтобы вернуться к этим техническим аспектам того, на что вы смотрите, нужно помнить, что существует большая разница между созданием новых объектов и взаимодействием с существующий файл или объект каталога как thing_that_has_a_name
. Если вы когда-нибудь сделаете заявление вроде:
directory d;
file f;
Это экземпляры. Конструкторы запускаются. Каким бы ни был sizeof
каталог, именно столько памяти d
только что получил. Каким бы ни был sizeof
файл, вот что f
только что получил. Однако:
thing_that_has_a_name& tthan_ref_to_d (d);
thing_that_has_a_name* tthan_ptr_to_f (&f);
Они просто создают ссылку и указатель, соответственно, через которые вы можете взаимодействовать с объектами каталога и файла через интерфейс, указанный в их базовом классе. Подобное «обновление» (называемое «вверх», потому что вы поднимаетесь по иерархии классов к корню) является относительно безопасным ... и не признаком того, что вы делаете что-то неправильно.
С другой стороны, «Даункинг» может быть опасным. Мы знаем, что каждый directory
и file
может рассматриваться как thing_that_has_a_name
... но если у вас есть указатель или ссылка на thing_that_has_a_name
, то произвольный код не может быть уверен, что это directory
или file
. Есть способы вставить условный код, чтобы проверить и убедиться, но это часто считается признаком того, что вы делаете что-то не так в своем дизайне:
http://en.wikipedia.org/wiki/Run-time_type_information
Другие предоставили еще некоторые подробности, поэтому я остановлюсь здесь, но просто добавлю их на случай, если вы найдете что-то полезное в этом.