Ответ должен быть ясен, если вы используете полиморфизм. То есть воспользуйтесь преимуществами языковых функций, которые позволяют рассматривать объект производного типа как один из базового типа. Предположим, что Person
является publi c base of PersonNamedJared
, и рассмотрим следующий код.
PersonNamedJared Jared;
Person * Pointer = &Jared;
std::cout << Pointer->name << " is " << Pointer->age << " years old.";
Это верно, но как этот код мог бы работать, если PersonNamedJared
не содержал name
field?
Как показывает опыт, если у вас есть законная причина, чтобы производный класс был меньше, чем его базовый класс, то, вероятно, что-то не так с вашим дизайном класса.
Что касается того, может ли быть язык с этой функцией, я думаю, что это возможно, но довольно неудобно. Вы можете - на гипотетическом языке - стереть грань между членами данных и членами функций, позволив идентификатору name
представлять (виртуальные) данные в базовом классе, но функцию в производных классах. Таким образом, производный класс может предоставлять функцию с именем name
, заменяющую версию базового класса. Вы можете заблокировать явные ссылки на версию name
базового класса * при работе с объектом производного типа. При достаточном количестве требований и запретов поле name
будет недоступно в определенных объектах производного класса, следовательно, им оно не понадобится. В этом случае поле имени можно не указывать. (Однако я не знаю ни одного языка, который допускает такую строгую настройку.)
С другой стороны, похоже, что такая настройка противоречит принципам наследования. Даже если бы язык позволял такую настройку, я бы предпочел лучший дизайн класса.