Вы не используете полиморфизм. Полиморфное поведение влияет только на указатели и ссылки на базовые классы, например:
class A; class B1 : A; class B2 : A;
B1 x;
B2 y;
A z;
A & a1 = x; // static type A&, dynamic type B1&
A & a2 = y; // static type A&, dynamic type B2&
A & a3 = z; // static and dynamic type A&
Теперь доступ к функциям-членам a1
, a2
, a3
подвержен полиморфизму и виртуальной диспетчеризации.
Однако , вы должны объявить первую функцию наверху виртуальной иерархии наследования, т.е. в A
! В вашем примере без virtual
полиморфизм отсутствует, и вы всегда вызываете функцию-член соответствующего статического типа объекта. Чтобы проверить это, добавьте еще несколько строк:
a & bref = b_obj;
bref.say_hi(); // call b::say_hi() if virtual, a::say_hi if not
bref.a::say_hi(); // always call a::say_hi()