C++的封裝、繼承和多態


封裝

C++中就表現為把一個具體的事物封裝成類

封裝可以隱藏細節,讓代碼模塊化。

一個類的成員有三種訪問權限:

  1. 公有:所有人均可訪問
  2. 保護:只有本類和本類的派生類中的成員函數可以訪問
  3. 私有:只有本類的成員函數可以訪問

 

繼承

可以分為單一繼承和多重繼承 

繼承方式:public private protectedclass默認private繼承,而structure默認public繼承 

  1. public:父類中public還是publicprotected還是protectedprivate對子類不可見
  2. protected:父類中publicprotected都變成了protected
  3. private:父類中publicprotected都變成了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

 

此時只能調用基類的相應函數

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM