1. 程式人生 > >C++什麼多型、覆蓋、重寫、過載剖析_boomgo

C++什麼多型、覆蓋、重寫、過載剖析_boomgo


首先說下多型、覆蓋、重寫、過載、隱藏其實沒那麼複雜,就只有三種,過載算一種,還有一種

就是覆蓋(也稱之為重寫),剩下那種最後說。

覆蓋是具有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;
}

輸出結果A BBBB
先說多型吧,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都覆蓋;