Это зависит.
Если foo()
вызывает bar()
таким образом:
some_type foo(){ A::bar(); }
Это привязка времени компиляции, и поэтому компилятор связывает этот вызов с A::bar()
даже если тип Dynami c равен B
.
Вместо этого, если foo()
вызывает bar()
следующим образом:
some_type foo(){ this->bar(); /*or just bar(), same thing*/}
Тогда, поскольку bar()
является виртуальным привязка будет разрешена во время выполнения, и поэтому она вызовет функцию bar()
для типа Dynami c, таким образом B::bar()
.
Итак, этот код:
class A
{
public:
virtual void foo(){this->bar();};
protected:
virtual void bar(){cout<<"A";};
};
class B : public A
{
protected:
void bar() override{cout<<"B";};
};
int main() {
std::shared_ptr<B> b_ptr(new B);
b_ptr->foo(); // B
}
Будет печатать B
, но этот код:
class A
{
public:
virtual void foo(){A::bar();};
protected:
virtual void bar(){cout<<"A";};
};
class B : public A
{
protected:
void bar() override{cout<<"B";};
};
int main() {
std::shared_ptr<B> b_ptr(new B);
b_ptr->foo(); // A
}
будет печатать A