Правила программирования на Си и Си++



         

135. Суперобложки на Си++ для существующих интерфейсов редко хорошо работают - часть 3


4     class caption

5     {

6        CWnd *target_window;

7

8     private: friend class

window;

9        caption( CWnd *p ) : target_window(p) {}

10

11     public:

12        operator CString ( void ) const;

13        const caption &operator=( const CString &s );

14     };

15

16     caption text( void );

17  };

18  //–-------------------------------------------------------

19  caption window::text( void )

20  {

21     return caption( this );

22  }

23  //--------------------------------------------------------

24  window::caption::operator CString( void ) const

25  {

26     CString output;

27     target_window->GetWindowText( output );

28     return output;                 // возвращает копию

29  }

30  //--------------------------------------------------------

31  const caption &window::caption::operator=(const

CString &s)

32  {

33     target_window->SetWindowText( s );

34     return *this;

35  }


Листинг 12. Заголовочный объект

class caption

2  {

3     CWnd target_window;

public:

5     window_text( CWnd *win ) : target_window( win ) {};

6

7     operator const CString( void );

8     const CString &operator=( const CString &r );

9  };

10

11  inline caption::operator CString( void

);

12  {

13     CString output;

14     target_window->GetWindowText( output );

15         return output;

16  }

17

18  inline const

CString &caption::operator=(const

CString &s )

19  {

20     // возвращает тип CString (вместо типа заголовка

21     // "caption"), поэтому будет срабатывать a = b = "абв"

22

23     target_window->SetWindowText( s );

24     return s;

26  }

Часть 8д. Виртуальные функции

Виртуальные функции придают объекту производного класса способность модифицировать поведение, определенное на уровне базового класса (или предоставить какие-то возможности, в которых базовый класс испытывал потребность, но не мог их реализовать обычно из-за того, что информация, нужная для этой реализации, объявляется на уровне производного класса). Виртуальные функции являются центральными для объектно-ориентированного проектирования, потому что они позволяют вам определить базовый класс общего назначения, не требуя знания особенностей, которые могут быть предусмотрены лишь производным классом. Вы можете писать программу, которая думает, что манипулирует объектами базового класса, но на самом деле во время выполнения воздействует на объекты производного класса. Например, вы можете написать код, помещающий объект в обобщенную структуру данных data_structure, но на самом деле во время выполнения он вставляет его в tree или linked_list (классы, производные от data_structure). Это настолько фундаментальная объектно-ориентированная операция, что программа на Си++, которая не использует виртуальные функции, вероятно, просто плохо спроектирована.




Содержание  Назад  Вперед