Нет - «это» не всегда приводит к наследованию. Хорошо процитированный пример - это связь между квадратом и прямоугольником. Квадрат - это прямоугольник, но будет плохо спроектировать код, который наследует класс Square от класса Rectangle.
Мое предложение состоит в том, чтобы усилить эвристику "is a / has" с помощью принципа замены Лискова . Чтобы проверить, соответствуют ли отношения наследования принципу замещения Лискова, спросите, могут ли клиенты базового класса работать с подклассом, не зная, что он работает с подклассом. Конечно, все свойства подкласса должны быть сохранены.
В примере квадрат / прямоугольник мы должны спросить, может ли клиент прямоугольника работать с квадратом, не зная, что это квадрат. Все, что клиент должен знать, это то, что он работает на прямоугольнике. Следующая функция демонстрирует клиент, который предполагает, что установка ширины прямоугольника оставляет высоту неизменной.
void g(Rectangle& r)
{
r.SetWidth(5);
r.SetHeight(4);
assert(r.GetWidth() * r.GetHeight()) == 20);
}
Это предположение верно для прямоугольника, но не для квадрата. Таким образом, функция не может работать на квадрате, и поэтому отношение наследования нарушает принцип подстановки Лискова.
(Кстати - пример взят из неработающей ссылки . Другие примеры )