Цитата Alan85:
если сделать так C(B& b) {b.foo();} »
|
С этим как раз понятно, в лучшем случае слетит ибо используем неинициализированную память с мусором.
Цитата Alan85:
(он же подкласс его) что дает a.foo() корректно »
|
a.foo() - виртуальным метод, имеющий реализации A::foo() и B::foo(). Например:
Код:
struct A
{
virtual void foo() {cout << "A::foo()\n";}
};
struct C
{
C(A& a) {test(a);}
void test(A& a)
{
clog << "C::test with &a=" << &a << ", this=" << this << "\n";
a.foo();
}
};
struct B : A, C
{
B() : A(), C(*this)
{
test(*this);
}
void foo() {cout << "B::foo()\n";}
};
С одними и теми же исходными данными получаем разный результат. Потому что первый раз вызов C::test произойдёт когда формально B ещё не достроен
Код:
C::test with &a=1245060, this=1245064
A::foo()
C::test with &a=1245060, this=1245064
B::foo()
Это особенность компилятора или стандарт с++ такой?