derived::print
не переопределяет любую функцию-член в base
.Он объявляется как имеющий единственный параметр типа double
, но две виртуальные функции-члены с именем print
в base
объявляются как имеющие один и два параметра типа int
.
Когда вы используетеb->print(d)
, только функции-члены в base
рассматриваются при разрешении перегрузки, поэтому учитываются только void base::print(int)
и void base::print(int, int)
.void derived::print(double)
не может быть найден, потому что компилятор не знает, что b
указывает на объект derived
.
Если derived
переопределит одну из двух print
функций, объявленных как виртуальныефункции-члены в base
, тогда это переопределение будет вызываться во время выполнения.
(В некотором родственном примечании derived::print
скрывает две base::print
функции-члена, поэтому если вы попытаетесь использовать одну из нихиз функций базового класса print
, например, derived().print(1, 1)
, произойдет сбой. Вам нужно будет использовать объявление using, чтобы сделать эти функции-члены доступными во время поиска по имени.)