Дело в том, что семантика для класса Square
отличается от семантики класса Rectangle
.Скажем, у вас есть общая вспомогательная функция, подобная этой:
void doubleArea(Rectangle &rect) {
rect.setWidth(rect.getWidth() * 2);
}
Предполагается, что вызов этой функции удвоит площадь (ширину × высоту) данного прямоугольника.
С вашимПроизводный класс Square
, теперь вы можете сделать что-то вроде этого:
Square sq(1);
doubleArea(sq);
Внезапно sq
имеет четыре раза область, затем перед вызовом.Вы только хотели удвоить площадь, но получили неверный результат.
Поскольку Square
не имеет точно такой же семантики, что и Rectangle
, иногда выполнение действий, подходящих для прямоугольников, не будет работать для квадратов,Поэтому не стоит утверждать, что Square
- это Rectangle
, получая одно из другого, поскольку производный класс не может выполнить все требования / обещания, сделанные базовым классом.
Дляподробнее об этом также читайте в статье C ++ FAQ Lite «Является ли круг чем-то вроде эллипса?» .