A::foo()
не virtual
. Вызов foo()
через указатель A*
(или A&
ссылку) вызовет A::foo()
напрямую без каких-либо полиморфных c диспетчеризации.
B::foo()
равно virtual
. Вызов foo()
через указатель B*
(или ссылку B&
) отправит вызов наиболее производной реализации foo()
, существующей в объекте, на который ссылается B*
(или B&
).
C
происходит от B
, а C::foo()
переопределяет B::foo()
, а obj
указывает на объект C
, поэтому C::foo()
вызывается polymorphi c dispatch, когда foo()
вызывается через указатель B*
или C*
(или ссылку B&
или C&
).