Если вы не квалифицируете вызов функции с помощью класса, все вызовы методов будут рассматриваться как равные, то есть динамическая диспетчеризация, если виртуальная, статическая диспетчеризация, если не виртуальная.Когда вы полностью укажете имя класса, метод, который вы вызываете, вы фактически отключите механизм динамической отправки и введете прямой вызов метода.
class A{
virtual void Foo(){
Boo(); // will call the final overrider
A::Boo(); // will call A::Boo, regardless of the dynamic type
}
virtual void Boo();
};
class B : public A{
void Foo(){
//Foo(); // Would call the final overrider
// (in this case B: infinite recursion)
A::Foo(); // Will call A::Foo, even if the object is B
}
void Boo();
};
Неявный указатель this
не является важной частьюЗдесь обсуждается то же самое, что и в случае вызова с явным объектом:
B b;
b.Foo(); // will call B::Foo -- note 1
b.A::Foo(); // will call A::Foo
Примечание 1. В этом примере компилятор может исключить механизм динамической отправки, поскольку ему известен конкретный типэкземпляр (он видит определение и не является ссылкой / указателем), но вы можете себе представить, что то же самое произошло бы, если бы b
была ссылкой, или эквивалентно, если бы это был указатель с ->
вместо .