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

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

C++之普通成員函數、虛函數以及純虛函數的區別與用法要點

2020-01-26 15:01:32
字體:
來源:轉載
供稿:網友

普通成員函數是靜態編譯的,沒有運行時多態,只會根據指針或引用的“字面值”類對象,調用自己的普通函數;虛函數為了重載和多態的需要,在基類中定義的,即便定義為空;純虛函數是在基類中聲明的虛函數,它可以再基類中有定義,且派生類必須定義自己的實現方法。

假設我們有三個類Person、Teacher、Student它們之間的關系如下:


這里寫圖片描述
類的關系圖

普通成員函數

【Demo1】
根據這個類圖,我們有下面的代碼實現

#ifndef __OBJEDT_H__#define __OBJEDT_H__#include <string>#include <iostream>class Person{public: Person(const string& name, int age) : m_name(name), m_age(age) { } void ShowInfo() { cout << "姓名:" << m_name << endl; cout << "年齡:" << m_age << endl; }protected: string m_name; //姓名 int m_age; //年齡};class Teacher : public Person{public: Teacher(const string& name, int age, const string& title) : Person(name, age), m_title(title) { } void ShowInfo() { cout << "姓名:" << m_name << endl; cout << "年齡:" << m_age << endl; cout << "職稱:" << m_title << endl; }private: string m_title; //職稱};class Student : public Person{public: Student(const string& name, int age, int studyId) : Person(name, age), m_studyId(studyId) { } void ShowInfo() { cout << "姓名:" << m_name << endl; cout << "年齡:" << m_age << endl; cout << "學號:" << m_studyId << endl; }private: int m_studyId;  //學號};#endif //__OBJEDT_H__

測試代碼:

void test(){ Person* pPerson = new Person("張三", 22); Teacher* pTeacher = new Teacher("李四", 35, "副教授"); Student* pStudent = new Student("王五", 18, 20151653); pPerson->ShowInfo(); cout << endl; pTeacher->ShowInfo(); cout << endl; pStudent->ShowInfo(); cout << endl; delete pPerson; delete pTeacher; delete pStudent;}

結果:

姓名:張三
年齡:22

姓名:李四
年齡:35
職稱:副教授

姓名:王五
年齡:18
學號:20151653
說明:
這里的ShowInfo就是一個普通的函數。pPerson、pTeacher和pStudent三個對象調用ShowInfo分別展示自己的信息。
我們知道:父類的指針是可以指向子類的對象的。我們把上面的測試代碼稍微改一下:
【Demo2】

void test(){ Person* pPerson = new Person("張三", 22); Person* pTeacher = new Teacher("李四", 35, "副教授"); Person* pStudent = new Student("王五", 18, 20151653); pPerson->ShowInfo(); cout << endl; pTeacher->ShowInfo(); cout << endl; pStudent->ShowInfo(); cout << endl; delete pPerson; delete pTeacher; delete pStudent;}

結果:

姓名:張三
年齡:22

姓名:李四
年齡:35

姓名:王五
年齡:18
這時,pTeacher和pStudent只輸出了姓名和年齡,并沒有輸出子類所具有的特性(職稱和學號)。這應該不是你期望的結果,你可能期望pTeacher和pStudent輸出老師和學生的完整信息,這時就需要用虛函數。

虛函數

我們把Person中的ShowInfo成員改成虛函數(在前面加上virtual),代碼如下:
【Demo3】

class Person{public: Person(const string& name, int age) : m_name(name), m_age(age) { } virtual void ShowInfo() { cout << "姓名:" << m_name << endl; cout << "年齡:" << m_age << endl; }protected: string m_name; //姓名 int m_age; //年齡};

在執行上面【Demo2】中的測試代碼,得到我們想到的結果:

姓名:張三
年齡:22

姓名:李四
年齡:35
職稱:副教授

姓名:王五
年齡:18
學號:20151653
虛函數用法要點:

  1. 虛函數的聲明方式:virtual RETURN_TYPE functionName(ARGS 參數列表);
  2. 虛函數作用:現實C++中的多態,進行動態綁定(父類指針可指向子類的對象),直到運行時才知道要調用哪個版本(哪個類定義)的函數;
  3. 我們必要對虛函數進行定義;
  4. 一旦父類的成員函數聲明virtual,其子類的函數不管有沒有聲明為virtual,都是虛函數;
  5. 如果虛函數使用默認實參,父類和子類定義的默認實參最好一致。

【Demo4】:針對第4點說明:

class Person{public: Person(const string& name, int age) : m_name(name), m_age(age) { } virtual void ShowInfo() { cout << "姓名:" << m_name << endl; cout << "年齡:" << m_age << endl; } string GetName(); //正確,普通函數如果不被使用,可以只有聲明沒有定義 virtual int GetAge(); //錯誤,虛函數必須要有定義,即使是一個空實現,因為編譯器無法確定會使用哪個函數protected: string m_name; //姓名 int m_age; //年齡};

【Demo5】:針對第5點進行說明:
設計我們的類如下定義。

class Person{public: virtual void SetAge(int age = 0) { m_age = age; } //... 省略};class Teacher : public Person{public: virtual void SetAge(int age = 1) { m_age = age; } //... 省略};class Student : public Person{public: virtual void SetAge(int age = 2) { m_age = age; } //... 省略};

測試1:

void test(){ Person* pPerson = new Person("張三", 22); Teacher* pTeacher = new Teacher("李四", 35, "副教授"); Student* pStudent = new Student("王五", 18, 20151653); pPerson->SetAge(); pTeacher->SetAge(); pStudent->SetAge(); pPerson->ShowInfo(); cout << endl; pTeacher->ShowInfo(); cout << endl; pStudent->ShowInfo(); cout << endl; delete pPerson; delete pTeacher; delete pStudent;}

結果:

姓名:張三
年齡:0

姓名:李四
年齡:1
職稱:副教授

姓名:王五
年齡:2
學號:20151653
測試2:

void test(){ Person* pPerson = new Person("張三", 22); Person* pTeacher = new Teacher("李四", 35, "副教授"); Person* pStudent = new Student("王五", 18, 20151653); pPerson->SetAge(); pTeacher->SetAge(); pStudent->SetAge(); pPerson->ShowInfo(); cout << endl; pTeacher->ShowInfo(); cout << endl; pStudent->ShowInfo(); cout << endl; delete pPerson; delete pTeacher; delete pStudent;}

結果:

姓名:張三
年齡:0

姓名:李四
年齡:0
職稱:副教授

姓名:王五
年齡:0
學號:20151653
純虛函數

在上面的例子中,我們假設所有的人都要工作,但不同的人工作的方式不同。于是我們就要強制要求繼承自Person的子類都要有工作的方法,這就需要純虛函數。定義如下:
【Demo6】

class Person{public: //... 省略 virtual void DoWork() = 0; //... 省略};

但此時我們編譯

Person* pPerson = new Person("張三", 22);


這句話時會報錯:error C2259: ‘Person' : cannot instantiate abstract class
這是因為我們并沒有為Person實現DoWork方法,而包含純虛函數的類是一個抽象的類,抽象類不能被實例化。

于是我們在子類中對它實現如下:
【Demo7】

class Teacher : public Person{public: //... 省略 virtual void DoWork() { cout << "教書..." << endl; } //... 省略};class Student : public Person{public: //... 省略 virtual void DoWork() { cout << "學習..." << endl; } //... 省略};

沒用DoWork方法:

void test(){ Person* pTeacher = new Teacher("李四", 35, "副教授"); Person* pStudent = new Student("王五", 18, 20151653); pTeacher->DoWork(); cout << endl; pStudent->DoWork(); cout << endl; delete pTeacher; delete pStudent;}

   結果:

    教書…

    學習…
純虛函數用法要點:

  1. 純虛函數的聲明方式:virtual RETURN_TYPE functionName(ARGS 參數列表) = 0;
  2. 含有純虛函數的類是一個抽象的類,抽象類不能被實例化。
  3. 包含純虛函數的抽象類常用來當作對外的接口,說明這個類有什么功能,而沒有具體的實現,基體的實現交由子類完成。

通過以上對普通成員函數、虛函數以及純虛函數的介紹,希望可以對大家有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久久亚洲精选| 日韩福利在线播放| 中文字幕日韩在线视频| 国产亚洲日本欧美韩国| 欧美精品一区二区免费| 26uuu日韩精品一区二区| 欧美理论在线观看| 国外视频精品毛片| 国产在线观看一区二区三区| 国产成人a亚洲精品| 日日狠狠久久偷偷四色综合免费| 亚洲女同性videos| 欧美激情在线播放| 国产成人精品一区二区| 亚洲欧美一区二区激情| 精品网站999www| 亚洲成av人影院在线观看| 国产精品精品视频| 久久久久久久久久久国产| 欧美亚洲国产精品| 亚洲精品国产精品久久清纯直播| 日韩成人在线免费观看| 亚洲第一区第二区| 日韩综合中文字幕| 搡老女人一区二区三区视频tv| 欧美在线中文字幕| 亚洲韩国欧洲国产日产av| 久久久噜久噜久久综合| 欧美成人全部免费| 亚洲爱爱爱爱爱| 国产精品露脸av在线| 久久精品久久久久电影| 亚洲欧美国产日韩天堂区| 国产精品自产拍高潮在线观看| 人人做人人澡人人爽欧美| 国产在线观看不卡| 日韩欧美国产网站| 精品色蜜蜜精品视频在线观看| 精品久久久久久中文字幕一区奶水| 高清欧美性猛交| 国产一区二区激情| 中文在线不卡视频| 欧美另类69精品久久久久9999| 一区二区av在线| 国产一区二区三区丝袜| 日韩精品一区二区视频| 国产成人在线亚洲欧美| 亚洲桃花岛网站| 91在线|亚洲| 欧美一级高清免费| 国产香蕉一区二区三区在线视频| 日韩电影免费观看在线观看| 欧美激情成人在线视频| 国产一区二区三区在线播放免费观看| 91高清视频免费观看| 欧美激情亚洲另类| 国产va免费精品高清在线观看| 好吊成人免视频| 国产精品中文字幕在线| 日韩有码片在线观看| 狠狠躁夜夜躁人人爽超碰91| 亚洲欧洲免费视频| 国产专区欧美专区| 欧美成人免费一级人片100| 粉嫩av一区二区三区免费野| 日本最新高清不卡中文字幕| 在线激情影院一区| 中文字幕日韩av电影| 欧美精品久久一区二区| 成人性生交大片免费看小说| 中文字幕亚洲一区| 亚洲第一精品久久忘忧草社区| 亚洲一区二区三| 欧美老女人在线视频| 国产亚洲视频在线| 亚洲美女av黄| 日本精品一区二区三区在线| 欧美激情第三页| xxxxx成人.com| 久久综合伊人77777尤物| 岛国视频午夜一区免费在线观看| 性视频1819p久久| 亚洲美女av电影| 亚洲精品98久久久久久中文字幕| 日韩经典第一页| 欧美成人性色生活仑片| 久久九九热免费视频| 欧美精品一本久久男人的天堂| 7m第一福利500精品视频| 亚洲精品视频播放| 91在线免费看网站| 亚洲精品免费网站| 亚洲无限乱码一二三四麻| 亚洲自拍av在线| 国产成人一区二区三区| 欧美一级免费看| 日本免费久久高清视频| 亚洲欧美在线第一页| 国产视频自拍一区| 国产精品日日做人人爱| 成人黄色免费在线观看| 亚洲天堂av图片| 精品成人久久av| 国产91色在线播放| 神马国产精品影院av| 国产精品久久久久久久久久三级| 中文字幕欧美日韩精品| 91久久嫩草影院一区二区| 亚洲欧美日韩久久久久久| 日韩一区av在线| 国产精品久久久一区| 欧美激情一区二区三级高清视频| 国产亚洲人成网站在线观看| 91国产精品电影| 久久国产精品偷| 久久精品电影网站| 欧美激情亚洲综合一区| 成人免费观看49www在线观看| 国产精品看片资源| 欧美专区在线观看| 97在线精品视频| 久久精品99久久久香蕉| 欧美成人精品三级在线观看| 欧美在线亚洲在线| 国产精品青青在线观看爽香蕉| 精品中文视频在线| 尤物99国产成人精品视频| 91免费国产网站| 91在线视频成人| 国产亚洲精品91在线| 国产成人涩涩涩视频在线观看| 久久天天躁日日躁| 精品色蜜蜜精品视频在线观看| 久久国产精品久久久久| 欧美日韩国产专区| 日韩美女在线看| 国产精品日韩欧美综合| 亚洲影视九九影院在线观看| 亚洲欧美中文字幕在线一区| 日韩av理论片| 91产国在线观看动作片喷水| 国产美女久久精品| 精品日本美女福利在线观看| 欧美激情一二区| 国产精品视频内| 97超级碰在线看视频免费在线看| 成人免费xxxxx在线观看| 国产成人精品久久二区二区| 国产v综合ⅴ日韩v欧美大片| 91在线观看欧美日韩| 青青草原一区二区| 亚洲三级 欧美三级| 亚洲人成电影在线播放| 最好看的2019年中文视频| 91探花福利精品国产自产在线| 日本午夜人人精品| 色伦专区97中文字幕| 亚洲一区中文字幕在线观看| 欧美一级视频一区二区| 欧美中文字幕视频在线观看| 久久精品一本久久99精品| 国产精品麻豆va在线播放| 国产精品成人播放| 欧美黑人巨大xxx极品|