封裝
在C++中就表現為把一個具體的事物封裝成類
封裝可以隱藏細節,讓代碼模塊化。
一個類的成員有三種訪問權限:
- 公有:所有人均可訪問
- 保護:只有本類和本類的派生類中的成員函數可以訪問
- 私有:只有本類的成員函數可以訪問
繼承
可以分為單一繼承和多重繼承
繼承方式:public private protected,class默認private繼承,而structure默認public繼承
- public:父類中public還是public,protected還是protected,private對子類不可見
- protected:父類中public和protected都變成了protected
- private:父類中public和protected都變成了private
一般析構函數會定義成虛函數,若不是的話析構時會只調用base的析構函數而不調用derived的析構
虛函數 & 多態性
父類的成員函數前面+virtual就變成了虛函數
純虛函數就是父類只定義了虛函數而沒有實現,純虛函數必須在子類中實現,否則子類仍為虛類需要子類的子類去實現純虛函數(也就是,哪一層子類實現的純虛函數,哪一層的子類才可以被初始化)
純虛函數相當於一個接口,子類必須實現這個接口才可以使用
而多態性則是為了接口重用,也就是無論傳遞過來的是哪個子類的對象,都能調用相應的子類的函數
代碼如下
#include <iostream> using namespace std; int main() { class base{ public: base(){}; ~base(){}; void aa(){cout<<"base"<<endl;}; }; class derived1:public base{ public: void aa(){cout<<"derived1"<<endl;}; ~derived1(){}; }; class derived2:public derived1{ public: void aa(){cout<<"derived2"<<endl;}; }; base *a; derived1 d1; derived2 d2; a = &d1; a->aa(); a = &d2; a->aa(); return 0; }
輸出為
derived1
derived2
可見有了多態性,我們用子類的實例初始化基類的指針,調用的才是子類相應的函數。若把virtual去掉,那么輸出就是
base
base
此時只能調用基類的相應函數