: Top(i). Left(0. j). Right(0.

Автор admin Вторник, 16 июня 2009 11:32

: Top(i). Left(0. j). Right(0. k) { w = m; } friend ostream& operator«(ostream& os. const Bottom& b) { return os « static_cast(b) « ‘.’ « static_cast(b) « ‘,’ « b.w: } }: int mainO { Bottom b(l. 2. 3. 4); cout « b « endl; // 1.2.1.3.4 } ///:- Нельзя просто передать ответственность наверх, как обычно, потому что оператор вывода каждого из классов Left и Right вызывает оператор вывода Тор, а это ведет к дублированию данных. Взамен необходимо вручную имитировать то, что компилятор делает при инициализации. В одном из решений в классах определяются специальные функции, которые знают о существовании виртуального базового класса и игнорируют его при выводе (так что решение задачи остается на долю последнего производного класса): //: С09:VirtualBase3.срр // Правильная реализация оператора « #include using namespace std; class Top { int x; public: Top(int n) { x = n; } friend ostream& operator«(ostream& os. const Top& t) { return os « t.x; } }: class Left : virtual public Top { int y; protected: void specialPrint(ostream& os) const { // Выводятся только данные Left os « ‘


Комментарии закрыты.