Interface* i = new Usage();
std::cout << i->bb() << std::endl;
Это работает, потому что имя функции разрешается в зависимости от типа объекта static
.
Здесь объект i
, тип static
которого равен Interface*
, имеет public
имя функции bb()
.Следовательно, компилятор не видит никаких проблем, поскольку это соответствует требованию вызова функции-члена.
Также обратите внимание, что accessibility (public
, private
и protected
) являются конструкциями времени компиляции.Во время выполнения такой вещи не существует.Компилятор может обнаружить любое нарушение правил, связанных с доступностью, только во время компиляции.Он не может знать, что происходит во время выполнения.
Таким образом, даже если i
указывает на объект, тип которого Usage
, который определил bb()
в разделе private
, компилятор в порядке, как отмечалось ранее для типа static
i
по-прежнему Interface*
с функцией public
bb()
.Компилятор не беспокоится о типе объекта dynamic и о том, как он переопределяет функцию, потому что он не может, именно по той причине, что его dynamic ;определяется во время выполнения.