почему следующий код печатает 100? - PullRequest
0 голосов
/ 19 февраля 2012

У меня есть следующие структуры

struct A 
{
   int i;
   A() { i = 0; }
   A(int _i) : i(_i) {}
   virtual void f() { cout << i; }
};



struct B1 : virtual A {
   B1() : A(1) { f(); }
   void f() { cout << i+10; }
};


struct B2 : virtual A {
   B2(int i) : A(2) { f(); }
};


struct C : B1, B2 {
   C() : B2(3) {}
};

, пожалуйста, объясните, почему следующий код печатает 100: (10 + 0)

 C* c = new C();

Я думаю, это должно напечатать 1111: первый A (): i = 0, затем B1 (): i = 1 и печатает B1::f() - 11, затем B2 (): печатает печатает B1::f() - 11

Где я ошибаюсь?

Спасибо

Ответы [ 3 ]

1 голос
/ 19 февраля 2012

Не печатается 100, печатается 10, за которым следует 0.

Структура означает, что поля являются закрытыми по умолчанию или общедоступными?

Public.

1 голос
/ 19 февраля 2012

Из-за наследования объект C «содержит» объект B1 и объект B2. И B1, и объект B2 "содержат" объект A, но, поскольку у вас есть виртуальное наследование A, у вас есть только один объект A в каждом объекте C, а не два. Этот единственный объект A инициализируется с использованием конструктора A по умолчанию.

1 голос
/ 19 февраля 2012

Публично по умолчанию в структуре.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...