C++什麼多型、覆蓋、重寫、過載剖析_boomgo
阿新 • • 發佈:2019-02-05
首先說下多型、覆蓋、重寫、過載、隱藏其實沒那麼複雜,就只有三種,過載算一種,還有一種
就是覆蓋(也稱之為重寫),剩下那種最後說。
覆蓋是具有virtual,概念就不說了。覆蓋就是多型的具體體現。不忘初心,方的始終,首先說說
為什麼要多型,多型作用是什麼呢?多型的作用就是介面重用,一行程式碼,傳進不同的引數,帶
來的結果不一樣,這就是多型的初衷。術語一點就是基類指標指向子類物件。上DEMO
// ClassConcept.cpp : 定義控制檯應用程式的入口點。 // #include "stdafx.h" #include <iostream> using namespace std; class A{ public: A(){cout<<"A con"<<endl;} void Test1(){cout << "A" <<endl;} virtual void Test2(){cout << "AAAA" <<endl;} }; class B: public A{ public: B(){cout<<"B con"<<endl;} void Test1(){cout << "B" <<endl;} virtual void Test2(){cout << "BBBB" <<endl;} }; int _tmain(int argc, _TCHAR* argv[]) { B b; A* a = new B(); //或者&b a->Test1(); a->Test2(); getchar(); return 0; }
先說多型吧,Test2有virtual,所以唄就是多型了,傳誰的參我就去調誰的 傳進來的是一個B的物件當
然去調B的輸出就是BBBBTest1沒有virtual,也不是多型,所以就不用考慮多型的初衷,誰呼叫我,我就
顯示那個 結果自然是A。這個辨析完,再來幾個變態的
A con A* a = (B*)new A(); //呼叫程式碼 A AAAA -------------------- A con B con A* a = (B*)new B(); A BBBB -------------------- A con B* a = (B*)new A(); B AAAA -------------------- A con B con B* a = (B*)new B(); B BBBB --------------------
對於有Virtual的,基本就是多型了,有virtual,編譯器會去看看他的虛表,
根據虛表的結果去呼叫,即使你強轉了或者怎麼,不同的物件,不同的虛表
結構,強轉只是相容型別,對其虛表結構不會產生影響,故呼叫那個就看那
個物件了。對於沒Virtual的,不用考慮多型的初衷-介面重用,不用去看它傳
進來的是哪個物件。直接看誰呼叫即可。
然後再說下隱藏,子類遮蔽了基類的函式,單獨說,和其他的沒關係,首先是在子類和基類中,----
函式名稱、引數都一致無virtual是覆蓋;
名稱相同,引數不同,不管有無virtual都覆蓋;