999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

C++多態(tài)性的實(shí)現(xiàn)過(guò)程

2023-06-15 05:26:44李家宏孫慶英
無(wú)線互聯(lián)科技 2023年2期
關(guān)鍵詞:程序

李家宏 孫慶英

摘要:多態(tài)性特征是C++中最為重要的一個(gè)特征,熟練使用多態(tài)是學(xué)好C++的關(guān)鍵,而理解多態(tài)的實(shí)現(xiàn)機(jī)制及實(shí)現(xiàn)過(guò)程則是熟練使用多態(tài)的關(guān)鍵。文章在分析多態(tài)性基本屬性的基礎(chǔ)上,結(jié)合具體程序?qū)嵗攸c(diǎn)分析了動(dòng)態(tài)多態(tài)的實(shí)現(xiàn)機(jī)制,并結(jié)合虛函數(shù)和聯(lián)編原理分析了動(dòng)態(tài)多態(tài)的實(shí)現(xiàn)過(guò)程。

關(guān)鍵詞:C++;多態(tài)性;虛函數(shù)

中圖分類(lèi)號(hào):TP312.1? 文獻(xiàn)標(biāo)志碼:A

0 引言

面向?qū)ο蟪绦蛟O(shè)計(jì)(Object Oriented Programming)是以對(duì)象為程序的基本單元,將數(shù)據(jù)和操作封裝其中,提高了軟件的重用性、靈活性和擴(kuò)展性,C++是面向?qū)ο蟪绦蛟O(shè)計(jì)語(yǔ)言的主流之一。現(xiàn)實(shí)世界的諸多事物,包括一些抽象規(guī)則、計(jì)劃或事件都可以描述成對(duì)象。對(duì)象是由數(shù)據(jù)(描述事物的屬性)和作用于數(shù)據(jù)的操作(事物的行為)構(gòu)成的一個(gè)獨(dú)立整體。

封裝、繼承和多態(tài)是面向?qū)ο笤O(shè)計(jì)的3大特點(diǎn)。封裝就是把客觀事物抽象得到的數(shù)據(jù)和行為封裝成一個(gè)整體,在C++中,實(shí)現(xiàn)數(shù)據(jù)和行為封裝的程序單元就叫類(lèi)。封裝就是將代碼模塊化,實(shí)現(xiàn)了類(lèi)內(nèi)部對(duì)象的隱蔽。繼承是由已經(jīng)存在的類(lèi)創(chuàng)建新類(lèi)的機(jī)制,體現(xiàn)在類(lèi)的層次關(guān)系中,子類(lèi)擁有父類(lèi)中的數(shù)據(jù)和方法,子類(lèi)繼承父類(lèi)的同時(shí)可以修改和擴(kuò)充自己的功能。多態(tài)是指父類(lèi)的方法被子類(lèi)重寫(xiě)、可以各自產(chǎn)生自己的功能行為。封裝和繼承的目的是代碼的重用,多態(tài)就是實(shí)現(xiàn)接口重用,即“一個(gè)接口,多種方法”。相比封裝和繼承,多態(tài)因其復(fù)雜性、靈活性更難以掌握和理解。

1 多態(tài)的概念

多態(tài)(polymorphism)一詞最早來(lái)源于拉丁語(yǔ)poly(意為多)和morphos(意為形態(tài)),意指具有多種形式或形態(tài)。它反映了人們?cè)谒妓鹘鉀Q問(wèn)題的辦法時(shí),對(duì)相似的問(wèn)題的一種求解方法[1]。

多態(tài)性一詞最早來(lái)源于生物學(xué),是指地球上所有生物,從食物鏈系統(tǒng)、物種水平、群體水平、基因水平等層次上所體現(xiàn)出的形態(tài)和狀態(tài)的多樣性[2]。多態(tài)性是指同樣的消息被不同類(lèi)型的對(duì)象接收時(shí)會(huì)產(chǎn)生完全不同的行為,即根據(jù)操作環(huán)境的不同采用不同的處理方式,一組具有相同基本語(yǔ)義的方法能在同一接口下為不同的對(duì)象服務(wù)[3]。在C++中利用類(lèi)繼承的層次關(guān)系來(lái)實(shí)現(xiàn)多態(tài),通常是把具有通用功能的聲明存放在類(lèi)層次高的地方,而把實(shí)現(xiàn)這一個(gè)功能的不同方法放在層次較低的類(lèi)中,C++語(yǔ)言通過(guò)子類(lèi)重定義父類(lèi)函數(shù)來(lái)實(shí)現(xiàn)多態(tài)。

2 多態(tài)的分類(lèi)

多態(tài)通常分為兩種:通用多態(tài)和特定多態(tài),其中,通用多態(tài)又細(xì)分為參數(shù)多態(tài)和包含多態(tài)[4]。參數(shù)多態(tài)在C++中就是利用函數(shù)模板或類(lèi)模板,給出的不同參數(shù)類(lèi)型,得到不同的結(jié)果,實(shí)現(xiàn)一個(gè)具有多種形態(tài)的結(jié)構(gòu)。包含多態(tài)在C++中的基礎(chǔ)就是虛函數(shù),即同樣的操作可用于一個(gè)類(lèi)型及其子類(lèi)型。特定多態(tài)細(xì)分為重載多態(tài)和強(qiáng)制多態(tài)。重載多態(tài)在C++中就是函數(shù)重載和運(yùn)算符重載,即同一個(gè)名(操作符、函數(shù)名)在不同的上下文中有不同的類(lèi)型。強(qiáng)制多態(tài),這里強(qiáng)制也稱為類(lèi)型轉(zhuǎn)換,在C++中一般指基本類(lèi)型轉(zhuǎn)換和自定義類(lèi)型轉(zhuǎn)換,即在編譯的時(shí)候發(fā)生數(shù)據(jù)混合運(yùn)算時(shí),程序通過(guò)語(yǔ)義操作,改變操作對(duì)象的類(lèi)型以符合運(yùn)行時(shí)函數(shù)和操作符的要求。通用多態(tài)和特定多態(tài)的區(qū)別是:通用多態(tài)對(duì)工作的類(lèi)型不加限制,允許不同類(lèi)型的值執(zhí)行相同的代碼,從語(yǔ)義上為相關(guān)聯(lián)性的類(lèi)型,特定多態(tài)對(duì)有限的類(lèi)型有效。不同類(lèi)型的值可能要執(zhí)行不同的代碼,從語(yǔ)義上為無(wú)關(guān)聯(lián)的類(lèi)型。

3 多態(tài)的實(shí)現(xiàn)

3.1 類(lèi)型兼容與函數(shù)重寫(xiě)

C++中的繼承遵循了類(lèi)型兼容性原則,即當(dāng)子類(lèi)以Public方式繼承父類(lèi)時(shí),將繼承父類(lèi)的所有屬性和方法,因此,可以變相的理解成子類(lèi)是一種特殊的父類(lèi),可以使用子類(lèi)對(duì)象初始化父類(lèi),也可以使用父類(lèi)的指針或引用來(lái)調(diào)用子類(lèi)的對(duì)象。

在程序設(shè)計(jì)過(guò)程中,很多時(shí)候會(huì)出現(xiàn)這樣一種情況,子類(lèi)繼承父類(lèi)的A函數(shù),但父類(lèi)的A函數(shù)不能滿足子類(lèi)的需求,此時(shí)需要在子類(lèi)中對(duì)A函數(shù)進(jìn)行重寫(xiě)。C++中的函數(shù)重寫(xiě)是指:函數(shù)名、參數(shù)、返回類(lèi)型均相同。如果程序中類(lèi)型兼容性原則遇到了函數(shù)重寫(xiě)會(huì)怎么樣,調(diào)用父類(lèi)的A函數(shù)還是子類(lèi)中重寫(xiě)的A函數(shù),類(lèi)型兼容與函數(shù)重寫(xiě)之間的關(guān)系可以用以下程序代碼闡釋?zhuān)?/p>

#include

using namespace std;

class Animal // 父類(lèi)

{

public:

void Speak()

{

cout << "動(dòng)物在說(shuō)話" << endl;

}

};

class Dog :public Animal// 子類(lèi)

{

public:

void Speak()

{

cout << "小狗在汪汪叫" << endl;

}

};

int main()

{

Dog dog;

dog.Speak();

dog.Animal::Speak();

Animal animal1 = dog;

animal1.Speak();

Animal * animal2 = & dog;

animal2->Speak();

return 0;

}

Animal animal1 = dog;

Animal * animal2 = & dog;

程序的運(yùn)行結(jié)果如圖1所示。

上述程序中定義了Animal和Dog兩個(gè)類(lèi),其中,Dog類(lèi)以Public方式繼承了Animal類(lèi),并且重寫(xiě)了Speak()方法。根據(jù)程序運(yùn)行結(jié)果不難看出:main()函數(shù)中定義的Dog類(lèi)對(duì)象dog的調(diào)用方法dog.Speak()是通過(guò)子類(lèi)對(duì)象的Speak()函數(shù)來(lái)實(shí)現(xiàn)小狗在汪汪叫功能。dog.Animal::Speak()是子類(lèi)對(duì)象通過(guò)使用操作符作用域調(diào)用父類(lèi)的Speak()函數(shù)來(lái)實(shí)現(xiàn):動(dòng)物在說(shuō)話。定義的Animal的對(duì)象animal1通過(guò)調(diào)用拷貝構(gòu)造函數(shù),把dog的數(shù)據(jù)拷貝到animal1中,animal1仍為父類(lèi)對(duì)象,所以animal1.Speak()執(zhí)行的結(jié)果是動(dòng)物在說(shuō)話。最終定義了一個(gè)指向Animal類(lèi)的指針animal2,將派生類(lèi)對(duì)象dog的地址賦給父類(lèi)指針animal2,利用該變量調(diào)用animal2–>speak()方法。得到的結(jié)果是:動(dòng)物在說(shuō)話。原因是C++編譯器進(jìn)行了類(lèi)型轉(zhuǎn)換,允許父類(lèi)和子類(lèi)之間進(jìn)行類(lèi)型轉(zhuǎn)換,即父類(lèi)指針可以直接指向子類(lèi)對(duì)象。根據(jù)賦值兼容,編譯器認(rèn)為父類(lèi)指針指向的是父類(lèi)對(duì)象,因此,編譯結(jié)果只可能是調(diào)用父類(lèi)中定義的同名函數(shù)。在此時(shí),C++認(rèn)為變量animal2中保存的就是Animal對(duì)象的地址,即編譯器不知道指針animal2指向的是一個(gè)什么對(duì)象,編譯器認(rèn)為最安全的方法就是調(diào)用父類(lèi)對(duì)象的函數(shù),因?yàn)楦割?lèi)和子類(lèi)肯定都有相同的Speak()函數(shù)。因此,在main()函數(shù)中執(zhí)行animal2–>Speak()時(shí),調(diào)用的是Animal對(duì)象的Speak()函數(shù)。

3.2 動(dòng)態(tài)聯(lián)編與靜態(tài)聯(lián)編

以上程序出現(xiàn)這種情況的原因涉及C++在具體編譯過(guò)程中函數(shù)調(diào)用的問(wèn)題,這種確定調(diào)用同名函數(shù)的哪個(gè)函數(shù)的過(guò)程就叫做聯(lián)編(又稱綁定)。在C++中聯(lián)編就是指函數(shù)調(diào)用與執(zhí)行代碼之間關(guān)聯(lián)的過(guò)程,即確定某個(gè)標(biāo)識(shí)符對(duì)應(yīng)的存儲(chǔ)地址的過(guò)程,在C++程序中,程序的每一個(gè)函數(shù)在內(nèi)存中會(huì)被分配一段存儲(chǔ)空間,而被分配的存儲(chǔ)空間的起始地址則為函數(shù)的入口地址。

按照程序聯(lián)編所進(jìn)行的階段,聯(lián)編可分為兩種:靜態(tài)聯(lián)編和動(dòng)態(tài)聯(lián)編。靜態(tài)聯(lián)編就是在程序的編譯與連接階段就已經(jīng)確定函數(shù)調(diào)用和執(zhí)行該調(diào)用的函數(shù)之間的關(guān)聯(lián)。在生成可執(zhí)行文件中,函數(shù)的調(diào)用所關(guān)聯(lián)執(zhí)行的代碼是確定好的,因此,靜態(tài)聯(lián)編也稱為早綁定(Early Binding)。動(dòng)態(tài)聯(lián)編是在程序的運(yùn)行時(shí)根據(jù)具體情況才能確定函數(shù)調(diào)用所關(guān)聯(lián)的執(zhí)行代碼,因此,動(dòng)態(tài)聯(lián)編也稱為晚綁定(Late Binding)[5]。

當(dāng)類(lèi)型兼容原則與函數(shù)重寫(xiě)發(fā)生沖突時(shí),程序員希望根據(jù)程序設(shè)計(jì)的子類(lèi)對(duì)象類(lèi)型來(lái)調(diào)用子類(lèi)對(duì)象的函數(shù),而不是編譯器認(rèn)為的調(diào)用父類(lèi)的對(duì)象函數(shù)。也就是說(shuō),如果父類(lèi)指針(引用)指向(引用)父類(lèi)的對(duì)象時(shí),程序就應(yīng)該調(diào)用父類(lèi)的函數(shù),如果父類(lèi)指針(引用)指向(引用)子類(lèi)的對(duì)象時(shí),程序就應(yīng)該調(diào)用子類(lèi)的函數(shù)。這一功能可以通過(guò)動(dòng)態(tài)聯(lián)編實(shí)現(xiàn)。與靜態(tài)聯(lián)編相比,動(dòng)態(tài)聯(lián)編是在程序運(yùn)行階段,根據(jù)成員函數(shù)基于對(duì)象的類(lèi)型不同,編譯的結(jié)果就不同,這就是動(dòng)態(tài)多態(tài)。動(dòng)態(tài)多態(tài)的基礎(chǔ)是虛函數(shù)。虛函數(shù)是用來(lái)表現(xiàn)父類(lèi)和子類(lèi)成員函數(shù)的一種關(guān)系。

3.3 虛函數(shù)

虛函數(shù)的定義方法是用關(guān)鍵字virtual修飾類(lèi)的成員函數(shù),虛函數(shù)的定義格式:virtual〈返回值類(lèi)型〉〈函數(shù)名〉(〈形式參數(shù)表〉)<函數(shù)體>。

在類(lèi)的層次結(jié)構(gòu)中,成員函數(shù)一旦被聲明為虛函數(shù),那么,該類(lèi)之后所有派生出來(lái)的新類(lèi)中其都是虛函數(shù)。父類(lèi)的虛函數(shù)在派生類(lèi)中可以不重新定義,若在子類(lèi)中沒(méi)有重新改寫(xiě)父類(lèi)的虛函數(shù),則調(diào)用父類(lèi)的虛函數(shù)。對(duì)兼容性與函數(shù)重寫(xiě)程序,進(jìn)行適當(dāng)?shù)男薷模瑢⒏割?lèi)Animal中的Speak()函數(shù)使用關(guān)鍵子Virtual將其定義為虛函數(shù),代碼如下所示。

#include

using namespace std;

class Animal // 父類(lèi)

{

public:

virtual void Speak() //用virtual 關(guān)鍵子定義Speak()為虛函數(shù)

{

cout << "動(dòng)物在說(shuō)話" << endl;

}

};

class Dog :public Animal// 子類(lèi)Dog以public方式繼承了Animal

{

public:

void Speak()//重寫(xiě)了Speak()函數(shù)

{

cout << "小狗在汪汪叫" << endl;

}

};

int main()

{

Dog dog;

dog.Speak();

dog.Animal::Speak();

Animal animal1 = dog;

animal1.Speak();

Animal * animal2 = & dog;

animal2->Speak();

return 0;

}

運(yùn)行結(jié)果如圖2所示。

Animal *animal2=&dog,animal2.Speak()時(shí),由于在父類(lèi)Animal的Speak()函數(shù)前加關(guān)鍵字Virtual,使得Speak()函數(shù)變成虛函數(shù),編譯器在編譯的時(shí)候,發(fā)現(xiàn)animal類(lèi)中有虛函數(shù),此時(shí),編譯器會(huì)為每個(gè)包含虛函數(shù)的類(lèi)創(chuàng)建一個(gè)虛函數(shù)表,該表是一個(gè)一維數(shù)組,在這個(gè)數(shù)組中存放每個(gè)虛函數(shù)的地址,這樣就實(shí)現(xiàn)了動(dòng)態(tài)聯(lián)編,也就是晚綁定。也就實(shí)現(xiàn)了前面說(shuō)的當(dāng)調(diào)用父類(lèi)指針(引用)指向(引用)子類(lèi)對(duì)象函數(shù)時(shí),調(diào)用的是子類(lèi)對(duì)象的函數(shù),實(shí)現(xiàn)了動(dòng)態(tài)多態(tài)。

通過(guò)分析發(fā)現(xiàn),要想實(shí)現(xiàn)動(dòng)態(tài)多態(tài)要滿足以下3個(gè)條件:(1)必須存在繼承關(guān)系,程序中的Dog類(lèi)以public的方式繼承了Animal類(lèi)。(2)繼承關(guān)系中必須要有同名的虛函數(shù)。在兩個(gè)類(lèi)中Speak()函數(shù)為同名虛函數(shù),子類(lèi)重寫(xiě)父類(lèi)的虛函數(shù)。(3)存在父類(lèi)的指針或引用調(diào)用子類(lèi)該虛函數(shù)。

了解多態(tài)是如何實(shí)現(xiàn)的之前,先要了解虛函數(shù)的調(diào)用原理,虛函數(shù)的調(diào)用原理和普通函數(shù)不一樣,編譯器在程序編譯的時(shí)候,發(fā)現(xiàn)類(lèi)中有關(guān)鍵字virtual的虛函數(shù)時(shí),編譯器會(huì)自動(dòng)為每個(gè)包含虛函數(shù)的類(lèi)創(chuàng)建一個(gè)虛函數(shù)表用來(lái)存放類(lèi)對(duì)象中虛函數(shù)的地址,并同時(shí)創(chuàng)建一個(gè)虛函數(shù)表指針指向該虛函數(shù)表[6]。每個(gè)類(lèi)使用一個(gè)虛函數(shù)表,每個(gè)類(lèi)對(duì)象用一個(gè)指向虛表地址的虛表指針。父類(lèi)對(duì)象包含一個(gè)指針指向父類(lèi)所有虛函數(shù)的地址,子類(lèi)對(duì)象也包含一個(gè)指向獨(dú)立地址的指針。如果子類(lèi)沒(méi)有重新定義虛函數(shù),該虛函數(shù)表將保存函數(shù)原始版本的地址,如果子類(lèi)提供了虛函數(shù)的新定義,該虛函數(shù)表將保存新函數(shù)的地址。示例程序中定義了兩個(gè)類(lèi)A和B,類(lèi)B繼承自類(lèi)A,父類(lèi)A中定義了兩個(gè)虛函數(shù),子類(lèi)B中重寫(xiě)了其中一個(gè)虛函數(shù),代碼如下所示:

class A

{

public:

virtual void fun1()

{

cout << "fun1是類(lèi)A虛函數(shù)";

}

virtual void fun2()

{

cout << "fun2是虛類(lèi)A函數(shù)";

}

};

class B :public A

{

public:

virtual void fun1()

{

cout << "fun1是類(lèi)B的虛函數(shù)";

}

};

分析上述程序,對(duì)于父類(lèi)A中的兩個(gè)虛函數(shù)fun1()和fun2(),由于子類(lèi)B重寫(xiě)了類(lèi)A中的fun1()函數(shù),就導(dǎo)致子類(lèi)B的虛函數(shù)表的第一個(gè)指針指向的是類(lèi)B的fun1()的函數(shù)而不是父類(lèi)A的fun1()函數(shù),具體如表1所示。

3.4 動(dòng)態(tài)多態(tài)的實(shí)現(xiàn)過(guò)程

編譯器進(jìn)行編譯程序時(shí)發(fā)現(xiàn)有virtual聲明的函數(shù),就會(huì)在這個(gè)類(lèi)中產(chǎn)生一個(gè)虛函數(shù)表。即使子類(lèi)中沒(méi)有用virtual定義虛函數(shù),由于父類(lèi)中的定義,子類(lèi)通過(guò)繼承后仍為虛函數(shù)。程序中Animal類(lèi)和Dog類(lèi)都包含一個(gè)虛函數(shù)Speak(),因此,編譯器會(huì)為這兩個(gè)類(lèi)都建立一個(gè)虛函數(shù)表,將虛函數(shù)地址存放到該表中(見(jiàn)圖3)。

編譯器在為每個(gè)類(lèi)創(chuàng)建虛函數(shù)表的同時(shí),還為每個(gè)類(lèi)的對(duì)象提供了一個(gè)虛函數(shù)表指針(vfptr),虛函數(shù)表指針指向了對(duì)象所屬類(lèi)的虛表。根據(jù)程序運(yùn)行的對(duì)象類(lèi)型去初始化虛函數(shù)表指針。虛函數(shù)表指針在沒(méi)有初始化的情況下,程序是無(wú)法調(diào)用虛函數(shù)的。虛函數(shù)表的創(chuàng)建和虛函數(shù)表指針的初始化是在構(gòu)造函數(shù)中實(shí)現(xiàn)的,在構(gòu)造子類(lèi)對(duì)象時(shí),先調(diào)用父類(lèi)的構(gòu)造函數(shù),并初始化父類(lèi)的虛函數(shù)指針,指向父類(lèi)的虛函數(shù)表,當(dāng)子類(lèi)對(duì)象執(zhí)行構(gòu)造函數(shù)時(shí),子類(lèi)對(duì)象的虛函數(shù)表指針也被初始化,指向子類(lèi)的虛函數(shù)表。實(shí)現(xiàn)了在調(diào)用虛函數(shù)時(shí),就能夠找到正確的函數(shù),如圖4所示。

C++編譯器在編譯時(shí),發(fā)現(xiàn)Animal類(lèi)的Speak()函數(shù)是虛函數(shù),此時(shí)C++就會(huì)采用動(dòng)態(tài)聯(lián)編技術(shù)。程序編譯時(shí)并不確定具體調(diào)用的函數(shù),而是在運(yùn)行時(shí),依據(jù)對(duì)象的類(lèi)型來(lái)確認(rèn)調(diào)用的是哪一個(gè)函數(shù),這種能力就叫做C++的多態(tài)性。在構(gòu)造子類(lèi)Dog對(duì)象dog時(shí),按照構(gòu)造函數(shù)調(diào)用的順序,先調(diào)用父類(lèi)Animal的構(gòu)造函數(shù)并初始化父類(lèi)對(duì)象虛函數(shù)表指針,該指針指向父類(lèi)的虛函數(shù)表。執(zhí)行子類(lèi)Dog構(gòu)造函數(shù)時(shí),子類(lèi)對(duì)象的虛函數(shù)表指針被初始化,指向自身的虛函數(shù)表。Dog類(lèi)的dog對(duì)象構(gòu)造完畢后,其內(nèi)部虛函數(shù)表指針被初始化為指向Dog類(lèi)的虛表。在調(diào)用時(shí),根據(jù)虛表中的函數(shù)地址找到Dog類(lèi)的Speak()函數(shù)完成對(duì)虛函數(shù)的調(diào)用,從而實(shí)現(xiàn)動(dòng)態(tài)綁定,實(shí)現(xiàn)了動(dòng)態(tài)多態(tài)。

4 結(jié)語(yǔ)

多態(tài)性作為面向?qū)ο蟪绦蛟O(shè)計(jì)語(yǔ)言的3大要素之一,因其靈活性、伸縮性和復(fù)雜性而難以掌握。本文著重分析多態(tài)的分類(lèi)、特征及動(dòng)態(tài)多態(tài)的實(shí)現(xiàn)機(jī)制和原理,但本文對(duì)于動(dòng)態(tài)多態(tài)的分析僅僅局限于單繼? 承的情況,對(duì)于多繼承的情況原理基本相同,本文未作過(guò)多說(shuō)明。

參考文獻(xiàn)

[1]李明明,管志偉.淺析C++多態(tài)的作用及實(shí)現(xiàn)原理[J].無(wú)線互聯(lián)科技,2014(7):116.

[2]吳克力.C++面向?qū)ο蟪绦蛟O(shè)計(jì)[M].北京:清華大學(xué)出版社,2021.

[3]謝云博.多態(tài)性實(shí)現(xiàn)機(jī)制在C++與JAVA中的比較分析[J].軟件導(dǎo)刊,2014(6):45-46.

[4]姚云霞.淺析C++中類(lèi)的多態(tài)性[J].隴東學(xué)院學(xué)報(bào),2012(1):9-11.

[5]劉晨.基于靜態(tài)聯(lián)編與動(dòng)態(tài)聯(lián)編多態(tài)性的研究[J].價(jià)值工程,2010(19):248-249.

[6]柯棟梁,李軍利.C++虛函數(shù)實(shí)現(xiàn)多態(tài)之案例驅(qū)動(dòng)教學(xué)方法探討[J].安徽工業(yè)大學(xué)學(xué)報(bào)(社會(huì)科學(xué)版),2012(4):114-115.

(編輯 何 琳)

Implementation of C++ polymorphism

Li? Jiahong, Sun? Qingying*

(Huaiyin Normal University, Huaian 223300, China)

Abstract:? Polymorphism is the most important feature in C++. Skillful use of polymorphism is the key to learn C++well, while understanding the implementation mechanism and process of polymorphism is the key to use polymorphism skillfully. Based on the analysis of the basic attributes of polymorphism, this paper focuses on the implementation mechanism of dynamic polymorphism with specific program examples, and analyzes the implementation process of dynamic polymorphism with virtual function and binding principle.

Key words: C++; polymorphism; virtual function

猜你喜歡
程序
給Windows添加程序快速切換欄
試論我國(guó)未決羈押程序的立法完善
失能的信仰——走向衰亡的民事訴訟程序
“程序猿”的生活什么樣
英國(guó)與歐盟正式啟動(dòng)“離婚”程序程序
基于VMM的程序行為異常檢測(cè)
偵查實(shí)驗(yàn)批準(zhǔn)程序初探
我國(guó)刑事速裁程序的構(gòu)建
創(chuàng)衛(wèi)暗訪程序有待改進(jìn)
恐怖犯罪刑事訴訟程序的完善
主站蜘蛛池模板: 亚洲高清在线天堂精品| 四虎永久免费地址| 欧美国产在线精品17p| 亚洲一区二区三区中文字幕5566| 亚洲欧美色中文字幕| 色综合天天综合| 高清欧美性猛交XXXX黑人猛交| 欧美 亚洲 日韩 国产| 国产国语一级毛片在线视频| 青青草一区| 亚洲午夜片| 亚洲精品无码久久久久苍井空| 四虎成人免费毛片| 女人18毛片久久| 久久精品国产91久久综合麻豆自制| a级毛片免费在线观看| 欧美区一区二区三| 欧美成a人片在线观看| 视频一本大道香蕉久在线播放| 中文字幕精品一区二区三区视频| 国产成年无码AⅤ片在线| 欧美激情综合一区二区| 日韩成人午夜| 黄色在线网| 热99精品视频| 国产在线视频二区| 日韩高清一区 | 毛片在线看网站| 欧美成人精品欧美一级乱黄| 中文无码精品A∨在线观看不卡| 国产欧美日韩在线一区| 国产欧美日韩综合在线第一| 亚洲男人的天堂久久香蕉网| 亚洲欧美不卡视频| 亚洲丝袜第一页| 日韩精品一区二区三区swag| 国产成人8x视频一区二区| 又猛又黄又爽无遮挡的视频网站 | 国产精品成人一区二区不卡| www.99在线观看| 97久久超碰极品视觉盛宴| AV不卡无码免费一区二区三区| 精品久久久久久中文字幕女| 日韩在线成年视频人网站观看| 欧美三级自拍| 亚洲国产91人成在线| 91人妻日韩人妻无码专区精品| 免费a级毛片视频| 国模极品一区二区三区| 中文字幕伦视频| 色综合五月婷婷| 婷婷六月激情综合一区| 香港一级毛片免费看| 色欲综合久久中文字幕网| 国产在线视频二区| 国产视频一二三区| 国产香蕉97碰碰视频VA碰碰看| 67194在线午夜亚洲 | 福利一区在线| 91无码人妻精品一区二区蜜桃| 毛片基地视频| 国产日韩欧美一区二区三区在线 | av天堂最新版在线| 欧美啪啪网| 免费A级毛片无码无遮挡| 无码精油按摩潮喷在线播放| 强乱中文字幕在线播放不卡| 天天综合色天天综合网| 华人在线亚洲欧美精品| 国产精品不卡片视频免费观看| 国产91麻豆视频| 国产成人精品免费视频大全五级| 美女无遮挡免费视频网站| 欧美全免费aaaaaa特黄在线| 国产亚洲欧美在线中文bt天堂 | 国产青榴视频| 日本a∨在线观看| 欧美三级视频网站| 国产一区二区网站| 精品国产免费观看一区| 怡红院美国分院一区二区| 欧美日韩第三页|