封裝、繼承和多態
阿新 • • 發佈:2019-01-18
接口 方式 成員 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(); }
封裝、繼承和多態