К примеру с квадратом и прямоугольником (56.00). Кажущаяся антиномия легко устраняется небольшим изменением семантики класса. Базовый класс (абстрактный) пусть реализует не понятие "квадрат", а понятие "фигура с (по крайней мере) одним размером": OneSizedShape. От него породить квадрат, окружность, отрезок (закрыв абстрактность). От OneSizedShape породить класс (абстрактный опять), добавляющий ещё одно поле: TwoSizedShape (сематика - "фигура с двумя (по крайней мере) размерами). От него - классы "прямоугольник", "эллипс" и др.
Предостережение от вызова виртуального метода в конструкторе и деструкторе (последние секунды) выглядит несколько упрощённым. Более подходящая трактовка: You _can_ (выделение моё) call a virtual function in a constructor, but be careful. It may not do what you expect. In a constructor, the virtual call mechanism is _disabled_ (выделение моё) because overriding from derived classes hasn’t yet happened. [isocpp.org/wiki/faq/strange-inheritance#calling-virtuals-from-ctors]
На 07.42 и на слайде - грубая ошибка: "полкласс является надмножеством" - на самом деле нет. У подкласса больше членов данных и методов, но объектов больше именно в надклассе - потому что объектами надкласса A являются как все объекты подкласса B1, так и все объекты подкласса B2. На самом деле, причина этого недоразумения - путаница в том, множеством чего именно следует считать класс: множеством объектов или множеством свойств. Чтобы путаницу устранить, следует обратиться к классической логике, а именно - к закону обратного отношения между объёмом и содержинием понятия. Подкласс - шире по содержанию и уже по объёму, надкласс - наоборот: беднее содержинием и шире по объёму.
К примеру с квадратом и прямоугольником (56.00). Кажущаяся антиномия легко устраняется небольшим изменением семантики класса. Базовый класс (абстрактный) пусть реализует не понятие "квадрат", а понятие "фигура с (по крайней мере) одним размером": OneSizedShape. От него породить квадрат, окружность, отрезок (закрыв абстрактность). От OneSizedShape породить класс (абстрактный опять), добавляющий ещё одно поле: TwoSizedShape (сематика - "фигура с двумя (по крайней мере) размерами). От него - классы "прямоугольник", "эллипс" и др.
Предостережение от вызова виртуального метода в конструкторе и деструкторе (последние секунды) выглядит несколько упрощённым. Более подходящая трактовка: You _can_ (выделение моё) call a virtual function in a constructor, but be careful. It may not do what you expect. In a constructor, the virtual call mechanism is _disabled_ (выделение моё) because overriding from derived classes hasn’t yet happened. [isocpp.org/wiki/faq/strange-inheritance#calling-virtuals-from-ctors]
Кстати, пример, демонстрирующий, что современные компиляторы умеют корректно вызывать виртуальные функции из конструкторов: ideone.com/V38VBe
@@vadimvinnik Ваш пример показывает прямой вызов функции-члена. Уберите из вашего примера virtual, и ничего принципиально не изменится.
На 07.42 и на слайде - грубая ошибка: "полкласс является надмножеством" - на самом деле нет. У подкласса больше членов данных и методов, но объектов больше именно в надклассе - потому что объектами надкласса A являются как все объекты подкласса B1, так и все объекты подкласса B2. На самом деле, причина этого недоразумения - путаница в том, множеством чего именно следует считать класс: множеством объектов или множеством свойств. Чтобы путаницу устранить, следует обратиться к классической логике, а именно - к закону обратного отношения между объёмом и содержинием понятия. Подкласс - шире по содержанию и уже по объёму, надкласс - наоборот: беднее содержинием и шире по объёму.
Хороший комментарий, но не совсем уместный. Просто посмотрите на название слайда, да и вообще на весь контекст.