1. 程式人生 > >封裝、繼承和多態

封裝、繼承和多態

接口 方式 成員 mes father out rtu clu oid

1、封裝

定義:將某些東西包裝隱藏,讓外界無法直接訪問,只能通過某些特定的方式訪問。

目的:增強安全性,簡化編程,使用者不用了解具體的實現細節,而只是通過外部接口以及特定的訪問權限來使用類的成員。  

2、繼承

定義:新類從已有類那裏得到已有的特性;

3、多態

定義:一個接口的多種實現;

動態多態:在程序運行時才能知道調用哪個函數,父類指針或者引用能夠指向子類對象調用子類函數。

非多態:

C++在編譯的時候要確定每個對象調用的函數,當son的地址賦給father,C++編譯器會進行類型轉換,C++編譯器會認為father保存的就是father的地址。

#include "pch.h"
#include "string"
#include <iostream>
using namespace std;
class Father
{
public:
    void face()
    {
        cout << "Father‘s face!" << endl;
    }
    void say()
    {
        cout << "Father say !" << endl;
    }
};
class Son :public Father
{
    
void face() { cout << "Son‘s face!" << endl; } void say() { cout << "Son say!" << endl; } }; int main() { Son son; Father *father = &son; father->say(); }

輸出結果:

技術分享圖片

多態:將父類say()函數聲明為virtual;

編譯器在編譯時發現Father類有虛函數,此時編譯器會為每個包含虛函數的類創建一個虛函數表(vtable),該表為一個一維數組用來存放虛函數的地址;同時編譯器會為每個對象創建一個虛表指針(vptr),這個指針指向所屬類的續表。

#include "pch.h"
#include "string"
#include <iostream>
using namespace std;
class Father
{
public:
    void face()
    {
        cout << "Father‘s face!" << endl;
    }
    virtual void say()
    {
        cout << "Father say !" << endl;
    }
};
class Son :public Father
{
    void face()
    {
        cout << "Son‘s face!" << endl;
    }
    void say()
    {
        cout << "Son say!" << endl;
    }
};
int main()
{
    Son son;
    Father *father = &son;
    father->say();
}

技術分享圖片

封裝、繼承和多態