, . , : class X { private: // protected: // , // public: // }; . , private, ; , protected, public. , , public. , , , . , . , ($$1.4.6, $$6.3, $$13.3). 12.5  , , , . , " ". , . , . , , , , . . , . , . - - . - , . - ++ - . _ . - . _ . - "". - "". - , , , . - , . - , : - , , -. - public protected, . - . - . - . $$11.5.  *  - , ( Bell Laboratories) ... . - . , ++. , , , , . , . , , , , , . 13.1  - , . - , , . , , . , , , , , , , , , , .. , . , , . , , , . . , . , . , , , - . , , , , , , , . ++ , . , , , . "", . "" , : ($$13.2), ($$13.3), ($$13.4), ($$13.8), ($$13.9). , . - . , - . , , . , , , . ($$13.6), . ($$13.7). , , , , . , , ( " " ). . , , . , "" , . ++ . , , , . , $$13.5. , . $$13.10. , , . , : ($$9.8), ($$10.4.2 $$9.4.3) , ($$8.4). , , (, ). , ( $$1. 4.3 $$8). , . , , 8. 13.2  vector ($$1.4), Slist ($$8.3), date ($$5.2.2) complex ($$7.3) , . . () . . , . , , . , , , . , , . , . , . , , , "" . , , : [1] ; [2] , , , " "; [3] ; [4] . , . , , , , . , ++, : , , , , , , , ( ) . , , . , - . , : ; ; , ; , ; , ; , .. " " (CDT - concrete data type, .. ) , " " (ADT - abstract data type, .. ). CDT ADT $$13.3. , . , slist vector , . , , , slist vector. , , slist, , . "" , , . , "" , . : void my(slist& sl) { for (T* p = sl.first(); p; p = sl.next()) { // } // ... } void your(vector& v) { for (int i = 0; i<v.size(); i++) { // } // ... } "" . , , . , , , , , , , , , . , , . , , , , : void user() { slist sl; vector v(100); my(sl); your(v); my(v); // : your(sl); // : } , , : void my(slist&); void my(vector&); void your(slist&); void your(vector&); void user() { slist sl; vector v(100); my(sl); your(v); my(v); // : my(vector&) your(sl); // : your(slist&) } , my() your() , . , , . , , , , , . , . - , , , , . . , . , , , () . , , . , , , , , . -. , , public, , , . - , , . 13.3  , , , , , . . set, T: class set { public: virtual void insert(T*) = 0; virtual void remove(T*) = 0; virtual int is_member(T*) = 0; virtual T* first() = 0; virtual T* next() = 0; virtual ~set() { } }; (set), . , . $$6.7. : class slist_set : public set, private slist { slink* current_elem; public: void insert(T*); void remove(T*); int is_member(T*); virtual T* first(); virtual T* next(); slist_set() : slist(), current_elem(0) { } }; class vector_set : public set, private vector { int current_index; public: void insert(T*); void remove(T*); int is_member(T*); T* first() { current_index = 0; return next(); } T* next(); vector_set(int initial_size) : array(initial_size), current_index(0) { } }; , . , , . , , . () . . $$13.2 : void my(set& s) { for (T* p = s.first(); p; p = s.next()) { // } // ... } void your(set& s) { for (T* p = s.first(); p; p = s.next()) { // } // ... } , my() your(), slist_set vector_set , set: void user() { slist_set sl; vector_set v(100); my(sl); your(v); my(v); your(sl); } , my() your() slist_set vector_set, my() your() . - , slist_set vector_set , . , , vector_set. , my() your() set.h, slist_set.h vector_set.h. , , ( ). , , , , . , . , . , "" - , , . , , set , . - . , ( - , ), , . , . , : [1] , ; [2] , ; [3] ; [4] . , , . - , , . , . , . , , , , . . "" , . . , . , . , , . , . . , , , , . , , " " , , , , . , , . , , , , . , "" , . , - , . slist vector set, slist_set vector_set? , ? : [1] : , vector slist , ( ). [2] : . [3] : , , "- ". , . [2] . ( ) , . slist. , slist, set, , , , , . , , . : set iter , slist stream . , , , . . $$13.6. , T: class iter { virtual T* first() = 0; virtual T* next() = 0; virtual ~iter() { } }; class slist_iter : public iter, private slist { slink* current_elem; public: T* first(); T* next(); slist_iter() : current_elem(0) { } }; class input_iter : public iter { isstream& is; public: T* first(); T* next(); input_iter(istream& r) : is(r) { } }; : void user(const iter& it) { for (T* p = it.first(); p; p = it.next()) { // ... } } void caller() { slist_iter sli; input_iter ii(cin); // sli user(sli); user(ii); } , , . $$13.5. , . $$13.9 . , , . 13.4  , , -, . . , , - . rectangle ($$6.4.2) satellite ($$6.5.1). , . . , , () , . , ( ), , . dialog_box, . "": class dialog_box : public window { // ... public: dialog_box(const char* ...); // // // ... virtual int ask(); }; ask() , . ask() . : void user() { for (;;) { // - dialog_box cont("continue", "try again", "abort", (char*) 0); switch (cont.ask()) { case 0: return; case 1: break; case 2: abort(); } } } . , , . , . dialog_box ( ) , . , . , dialog_box window () , : dialog_box cont("continue","try again","abort",(char*)0); cont.move(some_point); move() . dialog_box . , , , , (, ). dbox_w_str dialog_box: class dbox_w_str : public dialog_box { // ... public: dbox_w_str ( const char* sl, // const char* ... // ); int ask(); virtual char* get_string(); //... }; get_string() , . ask() dbox_w_str , , , (0). void user2() { // ... dbox_w_str file_name("please enter file name", "done", (char*)0); file_name.ask(); char* p = file_name.get_string(); if (p) { // } else { // } // } - : [1] , ; [2] (.. -) , ; [3] ( ) ; [4] ( ) ; [5] ; [6] ; [7] . , , 1, 2, 6 7. , 6, . , 7, . , . 4: , , , , . . , . 13.5  - . my(set&) $$13.3. void my_set(set& s) { for ( T* p = s.first(); p; p = s.next()) { // } // ... } , ,- , slist. , , . , . , , slist. , , my(set&) : void my(set& s) { if (ref_type_info(s) == static_type_info(slist_set)) { // // s slist slist& sl = (slist&)s; for (T* p = sl.first(); p; p = sl.next()) { // list } } else { for ( T* p = s.first(); p; p = s.next()) { // } } // ... } slist, , . , slist - , , slist_set. , , . , dialog_box $$13.4 , dbox_w_str. dbox_w_str, . , . , dbox_w_str , .. , dbox_w_str . , , . void f(dialog_box& db) { dbox_w_str* dbws = ptr_cast(dbox_w_str, &db); if (dbws) { // dbox_w_str // dbox_w_str::get_string() } else { // ``'' dialog_box } // ... } "" ptr_cast() () () , , ( ). dialog_box , . dialog_box: void g(dialog_box& db) { try { dbox_w_str& dbws = ref_cast(dialog_box,db); // dbox_w_str::get_string() } catch (Bad_cast) { // ``'' dialog_box } // ... } , , , (.. , dbox_w_str). . ref_cast() ptr_cast() : , , . 13.5.1  ++ , . ++ . . , , . , ++.