0%
  
    
  
  
  
  
    
    
      
      
    
    
      
      
    
    
    
      
      
    
      
    
    
    
    
        
- 继承
 
- 复合
 
- 委托
复合
 
- 表示有
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
   | template<class T>
  class queue{     ....     deque<T> c;     public:      bool empty() const{return c.empty();}      size_type size() const {return c.size();}      reference front(){return c.front();}      reference back(){return c.back();}            void push(const value_type& x){c.push_back(x);}      void pop(){c.pop_front();} }
 
  Container::Container():Component(){....}; Container::~Container():~Component(){....};
   | 
 
构造&析构
 
- 构造由内而外
 
- 析构由外而内
 
委托 Composition by Referce
- 内部有一个指针
1 2 3 4 5 6 7 8 9 10 11 12 13
   |  class StringRep; class String{     public:         String();         String(const char* s);         String(const String& s);         String &operator=(const String& s);         ~String();     private:         StringRep* rep;
  };
 
  | 
 
构造&析构
 
- 因为是引用所以生命周期可能不一致
 
继承
- is a
1 2 3 4 5 6 7 8 9 10
   | struct _List_node_base {     _List_node_base* _M_next;     _List_node_base* _M_prev; }
  template<typename _Tp> struct _List_node:public _List_node_base{     _Tp _M_data; }
   | 
 
构造&析构
 
- 构造由内而外
 
- 析构由外而内
 
父类函数的析构函数要是virtual
继承与虚函数
- non-virtual 函数:不希望子类重新定义
 
- virtual:希望子类重新定义,但已有默认定义
 
- pure vitual: 希望子类重新定义,当前没有默认定义
 
1 2 3 4 5 6
   | class Shape{     public:         virtual void draw() const =0;          virtual void error(const std::string& msg);          int objectID()const;  }
  | 
 
sample
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
   | CDocument::OnFileOpen(){     ...     Serialize();     ... }
  Class CMyDoc:public CDocument{     virtual Serialize(){
      } }
  main(){     CMyDoc myDoc;     ....     myDoc.OnFileOpen(); }
  | 
 
Template Method(设计模式)
- 构建子类对象
 
- 调用父类方法(父类方法中调用了,虚函数)