/** 做者: cwl 內容: 類的符合,繼承,委託 */ #include <bits/stdc++.h> using namespace std; class Father { public: Father(const string & _name = string("default")): name(_name), age(10) {} Father(const Father&); Father& operator = (const Father&); virtual void show() { cout << "father" << endl; } string name; int age; }; class Son: public Father { public: void show() { cout << "son" << endl; } }; void change1(Father &fa) { fa.show(); } void change2(Son &son) { son.show(); } int main() { /** template<class T> class queue { protected: 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(); } }; 【複合】咱們的Queue裏面有deque,咱們經過一個功能已經很強大的類 deque實現queue,只開放了一部分接口。能夠稱爲符合 同時也是一種設計模式 Adapter 1,構造和析構的關係 構造由內向外,析構有外向內。和繼承的構造析構類比理解 class String { public: ///... private: StringRep* rep; }; class StringRep { ///... }; 【委託】只是一種說法。這樣設計可以減低耦合性。 有一個指針指向實現了。方便切換 【繼承】 class Base { }; class Node : public Base { }; 能夠用is a 來解釋,蘋果是一種水果, 繼承的核心是搭配虛函數調用 class Shape { public: virtual void draw() const = 0; //純虛 virtual void error(const string &msg); //虛函數 int objetID() const; //普通函數 }; 【1】非虛函數,你不但願子類複寫這個函數,override 【2】虛函數,但願子類來定義 【3】存虛函數,但願子類必定去複寫,應爲你沒有定義 類的變量繼承的是內存的實例,在內存中子類有父類的變量(若是能夠繼承獲得) 類的函數繼承的是使用權 繼承測試 */ Father fa("test"); Son son; /** fa.show(); ///father son.show(); ///son change1(fa); ///father change1(son); ///father ///change2(fa); ///非法 change2(son); ///son */ /// void change1(Father &fa) /// { /// fa.show(); /// } ///不一樣點 change1(son); ///父類有virture輸出son, 沒有輸出father ///和於其符合,virtual但願重寫 ///關於虛函數的虛表部分作一些簡單瞭解 ///http://www.cnblogs.com/lihaosky/articles/1606502.html return 0; }