Все компилируется, но когда я вызываю B :: foo, я ожидаю, что B :: bar будет вызываться (в конце концов). Вместо этого я получаю A :: bar. Что я делаю не так?
Похоже, вы действительно не поняли, что пошло не так в вашем оригинальном коде , решили, что виноват виртуальный механизм переопределения, и затем вы опубликовали нерабочий пример который описывает то, что вы склонны верить , но что вы не удосужились проверить, потому что, если бы вы это видели, вы бы увидели, что не раскрывает описанное поведение . Вот скомпилированная версия вашего примера.
#include <stdio.h>
class A
{
public:
virtual void foo() { puts("A:foo()"); bar(); }
protected:
virtual void bar() { puts("A:bar()"); }
};
class B : public A
{
public:
virtual void foo() { puts("B:foo()"); A::foo(); }
protected:
virtual void bar() { puts("B:bar()"); }
};
int main()
{
B b;
b.foo();
}
Когда я запускаю это, я получаю:
$ g++ g++ h.cc
$ ./a.out
B:foo()
A:foo()
B:bar()
Так что с B :: bar () все в порядке.