да, извини, согласен - давно классами в сях не баловался. А верхний пример будет откомпилирован и выведет A::foo(), B::foo() если немного подправить синтаксис (точки с запетой между реализациями). Только хоть используй virtual тут хоть нет - результат тот же.
Код:
#include <iostream>
using namespace std;
class A
{
public:
void foo() {cout << "A::foo()\n";}
} ;
class C
{
public:
C(A& a) {a.foo();}
} ;
class B : A, C
{
public:
B() : A(), C(*this){/**/}
void foo() {cout << "B::foo()\n";}
} ;
main()
{
B b;
b.foo();
cin.get();
}