Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  

Показать сообщение отдельно
pva pva вне форума Автор темы

Аватара для pva

Ветеран


Сообщения: 1180
Благодарности: 279

Профиль | Отправить PM | Цитировать


Цитата 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()
Это особенность компилятора или стандарт с++ такой?

Отправлено: 14:36, 23-03-2009 | #14