最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++虛函數(shù)和多態(tài)超詳細分析

 更新時間:2023年01月20日 08:51:00   作者:king&南星  
這篇文章主要介紹了C++多態(tài)的特性派生與虛函數(shù)與模板,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧

1.什么是虛函數(shù)

C++類中用virtual修飾的函數(shù)叫做虛函數(shù),構(gòu)造函數(shù)沒有虛構(gòu)造函數(shù),存在虛析構(gòu)函數(shù),C++所有虛函數(shù)都是一個指針去存儲的,所以具有虛函數(shù)的類,內(nèi)存會增加一個指針大小的內(nèi)存

#include<iostream>
#include<string>
using namespace std;
class MM
{
public:
	//虛函數(shù)指針是同一個,所以無論該類中有多少個虛函數(shù),
	//占用的內(nèi)存就只是一個指針的大小
	virtual void print()
	{
		cout << "我是第一個虛函數(shù)" << endl;
	}
	virtual void printData() 
	{
		cout << "我是第二個虛函數(shù)" << endl;
	}
protected:
};
class son:public MM
{
public:
	void print() 
	{
		//該函數(shù)也是虛函數(shù),
        //父類中同名函數(shù)是虛函數(shù)
		//所以子類該函數(shù)也是虛函數(shù)
	}
protected:
};
int main() 
{
	cout << sizeof(MM) << endl;
	cout << "...................." << endl;
	//虛函數(shù)表的理解,下面帶圖解
	MM mm;
	long long** p = (long long**)&mm;
	using Func = void(*)();
	Func f1 = (Func)p[0][0];
	Func f2 = (Func)p[0][1];
	f1();
	f2();
	return 0;
}

2.純虛函數(shù)

純虛函數(shù)也是虛函數(shù)的一種,只是沒有函數(shù)體,下面請看怎么表示沒有函數(shù)體

純虛函數(shù)——>虛函數(shù)=0;

具有一個或者多個虛函數(shù)的類叫做抽象類

  • 抽象類不能構(gòu)建對象
  • 但是可以構(gòu)建函數(shù)指針
#include<iostream>
using namespace std;
class MM
{
public:
	virtual void print() = 0;
};
int main()
{
	//MM mm; //抽象類不能構(gòu)建對象
	MM* pmm = nullptr;
	return 0;
}

3.c++多態(tài)

多態(tài)指的是因為指針的不同的賦值操作所導(dǎo)致的同一行為的不同結(jié)果。多態(tài)的這個概念東西不太重要,重要的是什么樣的情況調(diào)用什么樣的行為

  • 正常指針和正常對象調(diào)用行為,就近原則
  • 父類指針被子類對象初始化
  • 函數(shù)有virtual看對象類型
  • 函數(shù)沒有virtual看指針類型
  • final關(guān)鍵字 禁止子類重寫父類方法
  • override顯示說明當(dāng)前函數(shù)是重寫函數(shù)

多態(tài)三個必要性條件:

  • 父類中存在虛函數(shù)
  • 存在不正常指針的引用(不正常賦值關(guān)系)
  • public繼承
#include<iostream>
using namespace std;
class MM
{
public:
	void print()
	{
		cout << "父類" << endl;
	}
	virtual void printData()
	{
		cout << "MM" << endl;
	}
};
class son :public MM 
{
public:
	void print() 
	{
		cout << "子類" << endl;
	}
	void printData() 
	{
		cout << "son" << endl;
	}
};
int main()
{
	MM* pmm = new son;
	pmm->print();
	pmm->printData();
	return 0;
}

4.純虛函數(shù)和ADT過程

ADT:abstract data type抽象數(shù)據(jù)類型,主要是通過繼承抽象類中,子類必須要實現(xiàn)父類的抽象方法,子類才可以創(chuàng)建對象。

#include<iostream>
#include<string>
using namespace std;
class data
{
public:
	string name;
	int age;
};
class MM
{
public:
	virtual bool empty() = 0;
	virtual int size() = 0;
};
class List:public MM
{
public:
	bool empty()
	{
		return 0;
	}
	int size()
	{
		return NULL;
	}
};
int main()
{
	MM* pmm = new List;
	pmm->empty();
	pmm->size();
}

5.虛析構(gòu)函數(shù)

virtual修飾的析構(gòu)函數(shù)就是虛析構(gòu)函數(shù),當(dāng)存在子類對象初始化父類指針的時候,父類析構(gòu)函數(shù)就要是虛析構(gòu)函數(shù),否則只會釋放父類,存在內(nèi)存泄漏問題

#include<iostream>
using namespace std;
class MM
{
public:
	virtual ~MM()
	{
		cout << "父類" << endl;
	}
};
class son:public MM
{
public:
	~son()
	{
		cout << "子類" << endl;
	}
};
int main()
{
	MM* pmm = new son;
	delete pmm;
	return 0;
}

6.dynamic_cast類型轉(zhuǎn)換

  • 上行轉(zhuǎn)換 子類到父類 和staic_cast差不多
  • 下行轉(zhuǎn)換 父類到子類 dynamic_cast更為安全
  • 交叉轉(zhuǎn)換 多繼承
#include<iostream>
using namespace std;
class MM
{
public:
	virtual void print() { cout << "MM" << endl; }
};
class son:public MM
{
public:
	void print() { cout << "son" << endl; }
};
class A
{
public:
	virtual void print(){}
};
class B
{
public:
	virtual void print() {}
};
class C:public A,public B
{
public:
	void print()
	{
		cout << "c" << endl;
	}
};
int main()
{
	MM* partent = new MM;
	son* Son = new son;
	//上行轉(zhuǎn)換----->沒有必要
	MM* p = static_cast<MM*>(Son);
	MM* pp = dynamic_cast<MM*>(Son);
	MM* ppp = Son;       //可以
	//下行轉(zhuǎn)換
	son* x = dynamic_cast<son*>(partent); //安全,父類沒有virtual會報錯---->多態(tài)
	if(!x)
	{
		printf("error");
	}                           //下行轉(zhuǎn)換不安全,不會申請成功
	A* a = new A;
	B* b = dynamic_cast<B*>(a);
	b->print();
	return 0;
}

7.成員函數(shù)指針

#include<iostream>
#include<functional>
using namespace std;
class MM
{
public:
	void print() { cout << "king" << endl; }
	static void printData() { cout << "MM" << endl; }
};
int main()
{
	void(*p)() = &MM::printData;
	p();
	//必須通過對象調(diào)用
	void(MM::*pp)() = &MM::print;
	MM mm;
	(mm.*pp)();
	//函數(shù)適配器,讓函數(shù)調(diào)用形態(tài)可以適用于別的形態(tài)
	auto f = bind(&MM::print, &mm);
	f();
	return 0;
}

到此這篇關(guān)于C++虛函數(shù)和多態(tài)超詳細分析的文章就介紹到這了,更多相關(guān)C++虛函數(shù)和多態(tài)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論

商水县| 九龙城区| 雅安市| 吉隆县| 梅河口市| 黔西| 介休市| 昂仁县| 景德镇市| 金寨县| 沙雅县| 天峨县| 威信县| 会泽县| 海丰县| 遵义市| 青铜峡市| 大悟县| 黄陵县| 台山市| 独山县| 广州市| 凭祥市| 阳信县| 沁水县| 长治县| 渝中区| 晋中市| 社会| 郎溪县| 垣曲县| 循化| 旺苍县| 牟定县| 慈溪市| 大理市| 霍州市| 怀仁县| 巧家县| 陕西省| 垦利县|