OOP&OOD

  • 继承
  • 复合
  • 委托

    复合

  • 表示有
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    template<class T>
    //设计模式是Adapter 适配器
    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
    //file String.hpp
    class StringRep;
    class String{
    public:
    String();
    String(const char* s);
    String(const String& s);
    String &operator=(const String& s);
    ~String();
    private:
    StringRep* rep;//pimpl 当前文件只是接口,具体实现由另一个类实现

    };

    构造&析构

  • 因为是引用所以生命周期可能不一致

继承

  • 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; //non-virtual
}

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(设计模式)

  1. 构建子类对象
  2. 调用父类方法(父类方法中调用了,虚函数)