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

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

C++教程:C++多態與虛函數(多態的實現)

2020-05-23 14:25:26
字體:
來源:轉載
供稿:網友
多態能夠方便我們編寫程序,可以讓不同的類與它獨特的成員函數一一對應。即使我們只是簡單地“稱呼”,程序也會很明白我們的心思。那么,多態應該如何實現呢?

多態的實現

在C++中,我們把表現多態的一系列成員函數設置為虛函數。虛函數可能在編譯階段并沒有被發現需要調用,但它還是整裝待發,隨時準備接受指針或引用的“召喚”。設置虛函數的方法為:在成員函數的聲明最前面加上保留字virtual。注意,不能把virtual加到成員函數的定義之前,否則會導致編譯錯誤。

下面我們把各種學生的學習都設置為虛函數,了解如何實現多態:(程序17.7.1)
//student.h
#include <iostream>
using namespace std;
class student
{
   public:
   student(char *n,int a,int h,int w);
   student();
   void set(char *n,int a,int h,int w);
   char * sname();
   int sage();
   int sheight();
   int sweight();
   virtual void study();//把學習設置為虛函數
   protected:
   char name[10];
   int age;
   int height;
   int weight;
};
char * student::sname()
{
   return name;
}
int student::sage()
{
   return age;
}
int student::sheight()
{
   return height;
}
int student::sweight()
{
   return weight;
}
void student::set(char *n,int a,int h,int w)
{
   int i;
   for (i=0;n[i]!='/0';i++)
   {
      name[i]=n[i];
   }
   name[i]='/0';
   age=a;
   height=h;
   weight=w;
   return;
}
student::student(char *n,int a,int h,int w)
{
   cout <<"Constructing a student with parameter..." <<endl;
   set(n,a,h,w);
}
student::student()
{
   cout <<"Constructing a student without parameter..." <<endl;
}
void student::study()//成員函數定義處沒有virtual
{
   cout <<"隨便學些什么。" <<endl;
   return;
}
//undergraduate.h
#include "student.h"
class Undergraduate:public student
{
   public:
   double score();
   void setGPA(double g);
   bool isAdult();
   virtual void study();//把學習設置為虛函數
   protected:
   double GPA;
};
double Undergraduate::score()
{
   return GPA;
}
void Undergraduate::setGPA(double g)
{
   GPA=g;
   return;
}
bool Undergraduate::isAdult()
{
   return age>=18?true:false;
}
void Undergraduate::study()//成員函數定義處沒有virtual
{
   cout <<"學習高等數學和大學英語。" <<endl;
   return;
}
//pupil.h
class Pupil:public student
{
   public:
   virtual void study();//把學習設置為虛函數
};
void Pupil::study()
{
   cout <<"學習語數外。" <<endl;
   return;
}
//main.cpp
#include <iostream>
#include "undergraduate.h"
#include "pupil.h"
using namespace std;
int main()
{
   Undergraduate s1;
   student s2;
   Pupil s3;
   student *sp=&s1;//sp指向本科生對象
   s1.set("Tom",21,178,60);
   sp->study();//體現多態性
   sp=&s2; //sp指向學生對象
   s2.set("Jon",22,185,68);
   sp->study();//體現多態性
   sp=&s3; //sp指向小學生對象
   s3.set("Mike",8,148,45);
   sp->study();//體現多態性
   return 0;
}
運行結果:
Constructing a student without parameter...
Constructing a student without parameter...
Constructing a student without parameter...
學習高等數學和大學英語。
隨便學些什么。
學習語數外。

我們看到,將學習設置為虛函數之后,無論對象指針sp指向哪種學生對象,sp->study()的執行結果總是與對應的類相符合的。多態就通過虛函數實現了。

我們在編寫成員函數的時候,可以把盡可能多的成員函數設置為虛函數。這樣做可以充分表現多態性,并且也不會給程序帶來不良的副作用。

無法實現多態的虛函數

使用虛函數可以實現多態,但是如果在使用虛函數的同時再使用重載,就會可能使虛函數失效。我們修改程序17.7.1,看看重載會給虛函數帶來些什么麻煩:(程序17.7.2)
//student.h
#include <iostream>
using namespace std;
class student
{
   public:
   student(char *n,int a,int h,int w);
   student();
   void set(char *n,int a,int h,int w);
   char * sname();
   int sage();
   int sheight();
   int sweight();
   virtual void study(int c=0);//設置為虛函數,帶默認參數
   protected:
   char name[10];//姓名
   int age;//年齡
   int height;//身高
   int weight;//體重
};
……
void student::study(int c)
{
   cout <<"隨便學些什么。" <<endl;
   return;
}
//undergraduate.h和pupil.h同程序17.7.1
//main.cpp
#include <iostream>
#include "undergraduate.h"
#include "pupil.h"
using namespace std;
int main()
{
   Undergraduate s1;
   student s2;
   Pupil s3;
   student *sp=&s1;
   s1.set("Tom",21,178,60);
   sp->study(1);//帶參數
   sp=&s2;
   s2.set("Jon",22,185,68);
   sp->study();
   sp=&s3;
   s3.set("Mike",8,148,45);
   sp->study();
   return 0;
}

運行結果:
Constructing a student without parameter...
Constructing a student without parameter...
Constructing a student without parameter...
隨便學些什么。
隨便學些什么。
隨便學些什么。

當學生類的study成員函數和本科生類的study成員函數參數格式不同時,即使把學生類中的study設置為虛函數,編譯器也無法找到本科生類中與之完全相同的study函數。多態是在程序員沒有指定調用父類還是某個子類的成員函數時,電腦根據程序員的要求,揣測并選擇最合適的成員函數去執行。但是當成員函數的參數格式不同時,程序員在調用成員函數的各種參數無疑就是在暗示到底調用哪個成員函數。這時電腦豈敢自作主張揣測人類的心思?因此,要使用虛函數實現多態性,至少要使各個函數的參數格式也完全相同。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久久久国产精品免费网站| 亚洲国产又黄又爽女人高潮的| 欧美激情视频给我| 疯狂蹂躏欧美一区二区精品| 91精品国产色综合久久不卡98口| 欧洲s码亚洲m码精品一区| 欧美一区二区大胆人体摄影专业网站| 97久久精品人人澡人人爽缅北| 成人激情免费在线| 亚洲精品成a人在线观看| 亚洲欧美激情视频| xxxxx成人.com| 欧美另类精品xxxx孕妇| 成人国产亚洲精品a区天堂华泰| 日韩三级成人av网| 国产欧美一区二区三区久久人妖| 在线国产精品视频| 日韩av网站导航| 国产成人精品电影久久久| 国产精品扒开腿做爽爽爽的视频| 日本亚洲精品在线观看| 国产第一区电影| 国产日韩在线亚洲字幕中文| 久久精品国产成人精品| 98精品国产高清在线xxxx天堂| 欧美成人免费全部观看天天性色| 成人激情视频在线| 国产成人精品在线观看| 亚洲国产精品yw在线观看| 日韩有码在线视频| 欧美性受xxxx白人性爽| 黄色精品在线看| 国产精品久久久久免费a∨大胸| 亚洲一区二区三区xxx视频| 91成人精品网站| 一区二区亚洲欧洲国产日韩| 亚洲奶大毛多的老太婆| 欧美日韩中文在线观看| 一本色道久久88综合亚洲精品ⅰ| 亚洲**2019国产| 亚洲成人精品久久| 亚洲欧美在线看| 亚洲国产精品成人va在线观看| 国产97色在线| 国产精品高清在线观看| 久久久久久久av| 欧美黄色性视频| 日韩精品免费在线视频| 精品久久久精品| 欧美一级免费看| 久久精品99国产精品酒店日本| 亚洲护士老师的毛茸茸最新章节| 久久久国产精彩视频美女艺术照福利| 久久久久久成人| 国产不卡精品视男人的天堂| 亚洲欧美日韩在线一区| 亚洲精品国产免费| 成人午夜一级二级三级| 91精品久久久久久久久久入口| 69**夜色精品国产69乱| 国产欧美日韩免费看aⅴ视频| 欧美高清videos高潮hd| 在线观看精品自拍私拍| 亚洲第一区第一页| 久久免费精品日本久久中文字幕| 国产精品一区二区在线| 狠狠色狠狠色综合日日小说| 日韩中文字幕久久| 欧美激情第99页| 一区二区欧美在线| 亚洲国产日韩欧美综合久久| 欧美日韩精品中文字幕| 精品国产乱码久久久久酒店| 久久久久久久爱| 成人av在线亚洲| 91精品久久久久久久久久久| 欧美成人精品一区| 亚洲精品一区二区三区婷婷月| 国产第一区电影| 精品福利樱桃av导航| 日韩av免费在线看| 久久久久久久香蕉网| 欧美午夜电影在线| 日本人成精品视频在线| 精品一区二区亚洲| 欧美日韩国产成人高清视频| 欧美视频精品一区| 亚洲激情电影中文字幕| 久久精品视频一| 国产精品久久久久久久久男| 欧美二区在线播放| 91最新在线免费观看| 国产色综合天天综合网| 欧美日韩国产黄| 亚洲色图在线观看| 岛国精品视频在线播放| 精品日韩视频在线观看| 亚洲精品视频二区| 欧美在线视频一二三| 成人在线播放av| 懂色aⅴ精品一区二区三区蜜月| 97久久精品视频| 狠狠久久五月精品中文字幕| 久久免费视频网站| 久久精品视频在线播放| 欧美日韩中文字幕在线视频| 久久久久久久激情视频| 日韩av网站大全| 91国产中文字幕| 久久亚洲精品一区二区| 97在线视频观看| 欧美一区二区影院| 欧美日韩一区二区免费视频| 精品福利樱桃av导航| 国产不卡一区二区在线播放| 国语对白做受69| 国产aⅴ夜夜欢一区二区三区| 欧美激情亚洲视频| 91免费看片在线| 日韩在线观看网址| 日本中文字幕成人| 欧美日韩在线观看视频| 亚洲欧美日本另类| 亚洲国产精品va在线看黑人动漫| 大伊人狠狠躁夜夜躁av一区| 91成品人片a无限观看| 三级精品视频久久久久| 欧美成人午夜剧场免费观看| 亚洲国产精品99| 福利视频导航一区| 欧美美女18p| 日韩av综合中文字幕| 国产精品日韩在线观看| 欧美日韩另类字幕中文| 欧美不卡视频一区发布| 7m第一福利500精品视频| 国产精品成av人在线视午夜片| 久久久久久久久久久91| 欧美中文字幕在线播放| 国产999精品视频| 亚洲一区二区三区777| 久久人人爽人人爽人人片亚洲| 中文字幕精品一区二区精品| 亚洲成人黄色网| 青草青草久热精品视频在线网站| 91精品视频播放| 国产精品视频成人| 亚洲系列中文字幕| 精品伊人久久97| 国产欧美一区二区三区在线| 亚洲激情在线观看| 午夜精品久久久久久久久久久久久| 91sao在线观看国产| 欧美人与性动交a欧美精品| 久久九九有精品国产23| 91天堂在线视频| 久久天天躁狠狠躁夜夜躁| 久久久这里只有精品视频| 欧美成人第一页| 亚洲欧美色婷婷| 亚洲国产欧美一区二区三区久久| 欧美极品第一页| 奇米4444一区二区三区| 亚洲最大av在线|