aRef
имеет Window
статический тип , но CommandButton
динамический тип bRef
просто объект типа Window
( CommandButton
'часть' была потеряна в копии )
Это обычно известно как срезы объектов иОбычно это предотвращается путем создания базовых классов абстрактных (путем предоставления чисто виртуальной функции) или не копируемых (например, с использованием boost::noncopyable
), потому что любое решение может привести к сбою кода в строке Window& aRef = *button;
.
Теперь, почему bRef.Create()
звонит Window::Create
?Ну, нет ничего, кроме Window
в bRef
, поэтому альтернативы не так уж много.По сути, это похоже на объявление Window
и вызов Create
: факт, что bRef
был скопирован из экземпляра CommandButton
, не имеет значения, поскольку часть CommandButton
была потеряна в копии.
Я попытаюсь прояснить это, цитируя стандарт (10.3 / 6):
[Примечание: интерпретация вызова виртуальной функции зависит от типа объекта, для которого онаназывается ( динамический тип ), тогда как интерпретация вызова не виртуальной функции-члена зависит только от типа указателя или ссылки, обозначающей этот объект ( статический тип ) (5.2.2).]
Статический тип объекта может отличаться только от указателя или косвенной косвенной ссылки.