亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

深入理解C++的多態性

2020-01-26 16:10:59
字體:
來源:轉載
供稿:網友
C++編程語言是一款應用廣泛,支持多種程序設計的計算機編程語言。我們今天就會為大家詳細介紹其中C++多態性的一些基本知識,以方便大家在學習過程中對此能夠有一個充分的掌握。

多態性可以簡單地概括為“一個接口,多種方法”,程序在運行時才決定調用的函數,它是面向對象編程領域的核心概念。多態(polymorphisn),字面意思多種形狀。

C++多態性是通過虛函數來實現的,虛函數允許子類重新定義成員函數,而子類重新定義父類的做法稱為覆蓋(override),或者稱為重寫。(這里我覺得要補充,重寫的話可以有兩種,直接重寫成員函數和重寫虛函數,只有重寫了虛函數的才能算作是體現了C++多態性)而重載則是允許有多個同名的函數,而這些函數的參數列表不同,允許參數個數不同,參數類型不同,或者兩者都不同。編譯器會根據這些函數的不同列表,將同名的函數的名稱做修飾,從而生成一些不同名稱的預處理函數,來實現同名函數調用時的重載問題。但這并沒有體現多態性。

多態與非多態的實質區別就是函數地址是早綁定還是晚綁定。如果函數的調用,在編譯器編譯期間就可以確定函數的調用地址,并生產代碼,是靜態的,就是說地址是早綁定的。而如果函數調用的地址不能在編譯器期間確定,需要在運行時才確定,這就屬于晚綁定。

那么多態的作用是什么呢,封裝可以使得代碼模塊化,繼承可以擴展已存在的代碼,他們的目的都是為了代碼重用。而多態的目的則是為了接口重用。也就是說,不論傳遞過來的究竟是那個類的對象,函數都能夠通過同一個接口調用到適應各自對象的實現方法。

最常見的用法就是聲明基類的指針,利用該指針指向任意一個子類對象,調用相應的虛函數,可以根據指向的子類的不同而實現不同的方法。如果沒有使用虛函數的話,即沒有利用C++多態性,則利用基類指針調用相應的函數的時候,將總被限制在基類函數本身,而無法調用到子類中被重寫過的函數。因為沒有多態性,函數調用的地址將是一定的,而固定的地址將始終調用到同一個函數,這就無法實現一個接口,多種方法的目的了。
筆試題目:
復制代碼 代碼如下:

#include<iostream>
using namespace std;
class A
{
public:
 void foo()
 {
  printf("1/n");
 }
 virtual void fun()
 {
  printf("2/n");
 }
};
class B : public A
{
public:
 void foo()
 {
  printf("3/n");
 }
 void fun()
 {
  printf("4/n");
 }
};
int main(void)
{
 A a;

 A *p = &a;
 p->foo();
 p->fun();
 p = &b;
 p->foo();
 p->fun();
 return 0;
}

第一個p->foo()和p->fuu()都很好理解,本身是基類指針,指向的又是基類對象,調用的都是基類本身的函數,因此輸出結果就是1、2。
第二個輸出結果就是1、4。p->foo()和p->fuu()則是基類指針指向子類對象,正式體現多態的用法,p->foo()由于指針是個基類指針,指向是一個固定偏移量的函數,因此此時指向的就只能是基類的foo()函數的代碼了,因此輸出的結果還是1。而p->fun()指針是基類指針,指向的fun是一個虛函數,由于每個虛函數都有一個虛函數列表,此時p調用fun()并不是直接調用函數,而是通過虛函數列表找到相應的函數的地址,因此根據指向的對象不同,函數地址也將不同,這里將找到對應的子類的fun()函數的地址,因此輸出的結果也會是子類的結果4。
筆試的題目中還有一個另類測試方法。即
B *ptr = (B *)&a;  ptr->foo();  ptr->fun();
問這兩調用的輸出結果。這是一個用子類的指針去指向一個強制轉換為子類地址的基類對象。結果,這兩句調用的輸出結果是3,2。
并不是很理解這種用法,從原理上來解釋,由于B是子類指針,雖然被賦予了基類對象地址,但是ptr->foo()在調用的時候,由于地址偏移量固定,偏移量是子類對象的偏移量,于是即使在指向了一個基類對象的情況下,還是調用到了子類的函數,雖然可能從始到終都沒有子類對象的實例化出現。
而ptr->fun()的調用,可能還是因為C++多態性的原因,由于指向的是一個基類對象,通過虛函數列表的引用,找到了基類中fun()函數的地址,因此調用了基類的函數。由此可見多態性的強大,可以適應各種變化,不論指針是基類的還是子類的,都能找到正確的實現方法。
復制代碼 代碼如下:

//小結:1、有virtual才可能發生多態現象
// 2、不發生多態(無virtual)調用就按原類型調用
#include<iostream>
using namespace std;
class Base
{
public:
 virtual void f(float x)
 {
  cout<<"Base::f(float)"<< x <<endl;
 }
 void g(float x)
 {
  cout<<"Base::g(float)"<< x <<endl;
 }
 void h(float x)
 {
  cout<<"Base::h(float)"<< x <<endl;
 }
};
class Derived : public Base
{
public:
 virtual void f(float x)
 {
  cout<<"Derived::f(float)"<< x <<endl;   //多態、覆蓋
 }
 void g(int x)
 {
  cout<<"Derived::g(int)"<< x <<endl;     //隱藏
 }
 void h(float x)
 {
  cout<<"Derived::h(float)"<< x <<endl;   //隱藏
 }
};
int main(void)
{
 Derived d;
 Base *pb = &d;
 Derived *pd = &d;
 // Good : behavior depends solely on type of the object
 pb->f(3.14f);   // Derived::f(float) 3.14
 pd->f(3.14f);   // Derived::f(float) 3.14
 // Bad : behavior depends on type of the pointer
 pb->g(3.14f);   // Base::g(float)  3.14
 pd->g(3.14f);   // Derived::g(int) 3
 // Bad : behavior depends on type of the pointer
 pb->h(3.14f);   // Base::h(float) 3.14
 pd->h(3.14f);   // Derived::h(float) 3.14
 return 0;
}

令人迷惑的隱藏規則
本來僅僅區別重載與覆蓋并不算困難,但是C++的隱藏規則使問題復雜性陡然增加。
這里“隱藏”是指派生類的函數屏蔽了與其同名的基類函數,規則如下:
(1)如果派生類的函數與基類的函數同名,但是參數不同。此時,不論有無virtual
關鍵字,基類的函數將被隱藏(注意別與重載混淆)。
(2)如果派生類的函數與基類的函數同名,并且參數也相同,但是基類函數沒有virtual
關鍵字。此時,基類的函數被隱藏(注意別與覆蓋混淆)。
上面的程序中:
(1)函數Derived::f(float)覆蓋了Base::f(float)。
(2)函數Derived::g(int)隱藏了Base::g(float),而不是重載。
(3)函數Derived::h(float)隱藏了Base::h(float),而不是覆蓋。
C++純虛函數
一、定義
純虛函數是在基類中聲明的虛函數,它在基類中沒有定義,但要求任何派生類都要定義自己的實現方法。在基類中實現純虛函數的方法是在函數原型后加“=0”
virtual void funtion()=0
二、引入原因
1、為了方便使用多態特性,我們常常需要在基類中定義虛擬函數。
2、在很多情況下,基類本身生成對象是不合情理的。例如,動物作為一個基類可以派生出老虎、孔雀等子類,但動物本身生成對象明顯不合常理。
為了解決上述問題,引入了純虛函數的概念,將函數定義為純虛函數(方法:virtual ReturnType Function()= 0;),則編譯器要求在派生類中必須予以重寫以實現多態性。同時含有純虛擬函數的類稱為抽象類,它不能生成對象。這樣就很好地解決了上述兩個問題。
三、相似概念
1、多態性
指相同對象收到不同消息或不同對象收到相同消息時產生不同的實現動作。C++支持兩種多態性:編譯時多態性,運行時多態性。
a、編譯時多態性:通過重載函數實現
b、運行時多態性:通過虛函數實現。
2、虛函數
虛函數是在基類中被聲明為virtual,并在派生類中重新定義的成員函數,可實現成員函數的動態覆蓋(Override)
3、抽象類
包含純虛函數的類稱為抽象類。由于抽象類包含了沒有定義的純虛函數,所以不能定義抽象類的對象。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
在线精品播放av| 最近2019好看的中文字幕免费| 日韩精品久久久久久福利| 日本a级片电影一区二区| 亚洲最大成人网色| 久久精品99无色码中文字幕| 精品国产一区二区三区久久狼黑人| 日韩欧美精品网站| 永久555www成人免费| 日本欧美精品在线| 亚洲人成网在线播放| 亚洲一区二区三区成人在线视频精品| 色无极亚洲影院| 亚洲国产成人精品一区二区| 日本午夜人人精品| 成人av色在线观看| 国产精品美女无圣光视频| 日韩精品视频免费专区在线播放| 日韩欧美有码在线| 日本高清视频精品| 精品国产一区二区在线| 精品露脸国产偷人在视频| 国产精品视频在线播放| 精品国偷自产在线视频| 国产精品爱久久久久久久| 在线看国产精品| 久精品免费视频| 欧美一级片在线播放| 中文字幕视频一区二区在线有码| 亚洲午夜国产成人av电影男同| 日本欧美在线视频| 欧美一区二区三区艳史| 亚洲欧美国产制服动漫| 中文字幕在线精品| 久久亚洲成人精品| 国产亚洲精品久久久久久| 欧美激情视频三区| 九九热精品在线| 精品国产一区二区三区久久狼黑人| 青草青草久热精品视频在线观看| 国产自产女人91一区在线观看| 欧美日韩国产精品一区| 欧美在线亚洲一区| 91色视频在线导航| 亚洲精品按摩视频| 97精品久久久中文字幕免费| 亚洲free性xxxx护士hd| 国产精品偷伦一区二区| 欧美乱大交做爰xxxⅹ性3| 日韩欧美中文在线| 久久69精品久久久久久久电影好| 欧美性极品xxxx做受| 北条麻妃久久精品| 91亚洲va在线va天堂va国| 国产精品福利在线观看网址| 国产日韩换脸av一区在线观看| 亚洲片国产一区一级在线观看| 日韩欧美成人免费视频| 日韩免费在线看| 欧美激情网友自拍| 国产成人精品久久| 日韩精品高清在线观看| 国产69精品久久久久久| 国产视频欧美视频| 2025国产精品视频| 欧美性感美女h网站在线观看免费| 97av在线影院| 久久成人18免费网站| 国产日韩一区在线| 久久69精品久久久久久国产越南| 国产欧美一区二区白浆黑人| 在线成人中文字幕| 日韩性生活视频| 奇米四色中文综合久久| 91九色视频导航| 日韩免费观看在线观看| 亚洲人成绝费网站色www| 欧美性猛交xxxx免费看久久久| 91精品久久久久久综合乱菊| 国内揄拍国内精品少妇国语| 午夜精品久久久久久久99热| 国产精品扒开腿做| 视频一区视频二区国产精品| 日韩在线中文字| 国产成人av网| 久久手机精品视频| 欧美精品一二区| 亚洲激情国产精品| 欧美日韩免费看| 亚洲天堂av综合网| 成人免费大片黄在线播放| 国产欧美精品xxxx另类| 国产成人久久久| 亚洲人成网站777色婷婷| 久久精品国产91精品亚洲| 亚洲美女中文字幕| 另类视频在线观看| 久久久久久久久久国产精品| 91超碰中文字幕久久精品| 国产视频福利一区| 日韩av网站电影| 色吧影院999| 欧美精品免费在线| 国产人妖伪娘一区91| 国产伦精品一区二区三区精品视频| 久久久久久免费精品| 国产精品日韩欧美大师| 91高清视频免费| 亚洲午夜激情免费视频| 日韩高清电影免费观看完整| 欧美国产欧美亚洲国产日韩mv天天看完整| 福利精品视频在线| 国产一区二区三区在线免费观看| 91青草视频久久| 最近2019年手机中文字幕| 久久躁狠狠躁夜夜爽| 欧美日韩国产精品一区二区不卡中文| 欧美老女人性生活| 中日韩美女免费视频网址在线观看| 久青草国产97香蕉在线视频| 欧美性xxxx18| 欧美亚洲另类激情另类| 亚洲欧美日韩国产精品| 亚洲成av人片在线观看香蕉| 欧美成人免费视频| 国产欧美一区二区三区四区| 亚洲精品自在久久| 国产精品久久999| 这里只有精品在线播放| 国产97在线播放| 久久夜精品va视频免费观看| 国模精品视频一区二区| 8090理伦午夜在线电影| 成人免费看吃奶视频网站| 亚洲国产精久久久久久| 精品亚洲va在线va天堂资源站| 国产综合久久久久久| 久久久久久久色| 亚洲国产精品va在看黑人| 色综合久久88| 欧美伊久线香蕉线新在线| 久久99精品视频一区97| 欧美中文字幕在线播放| 久久精品91久久久久久再现| 亚洲国产欧美一区二区三区同亚洲| 国产97人人超碰caoprom| 国产精品海角社区在线观看| 国产精品久久77777| 国产不卡在线观看| 亚洲伊人成综合成人网| 国产欧美精品日韩精品| 亚洲天堂视频在线观看| 中文字幕亚洲情99在线| 久久久久久美女| 亚洲国产精品悠悠久久琪琪| 久久精品免费播放| 国内外成人免费激情在线视频网站| 欧美另类老肥妇| 国产精品极品美女粉嫩高清在线| 亚洲aa在线观看| 在线观看国产成人av片| 国产精品日韩欧美| 91亚洲国产成人精品性色| 庆余年2免费日韩剧观看大牛|