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

C++之普通成員函數(shù)、虛函數(shù)以及純虛函數(shù)的區(qū)別與用法要點

 更新時間:2015年07月21日 17:31:38   作者:luoweifu  
本篇文章主要介紹了C++中的普通成員函數(shù)、虛函數(shù)以及純虛函數(shù),非常的詳細,有需要的朋友可以參考下

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

假設(shè)我們有三個類Person、Teacher、Student它們之間的關(guān)系如下:


這里寫圖片描述
類的關(guān)系圖

普通成員函數(shù)

【Demo1】
根據(jù)這個類圖,我們有下面的代碼實現(xiàn)

#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 << "學(xué)號:" << m_studyId << endl;
 }

private:
 int m_studyId;  //學(xué)號
};

#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;
}

結(jié)果:

姓名:張三
年齡:22

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

姓名:王五
年齡:18
學(xué)號:20151653
說明:
這里的ShowInfo就是一個普通的函數(shù)。pPerson、pTeacher和pStudent三個對象調(diào)用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;
}

結(jié)果:

姓名:張三
年齡:22

姓名:李四
年齡:35

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

虛函數(shù)

我們把Person中的ShowInfo成員改成虛函數(shù)(在前面加上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; //年齡
};

在執(zhí)行上面【Demo2】中的測試代碼,得到我們想到的結(jié)果:

姓名:張三
年齡:22

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

姓名:王五
年齡:18
學(xué)號:20151653
虛函數(shù)用法要點:

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

【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(); //正確,普通函數(shù)如果不被使用,可以只有聲明沒有定義
 virtual int GetAge(); //錯誤,虛函數(shù)必須要有定義,即使是一個空實現(xiàn),因為編譯器無法確定會使用哪個函數(shù)


protected:
 string m_name; //姓名
 int m_age; //年齡
};

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

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;
}

結(jié)果:

姓名:張三
年齡:0

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

姓名:王五
年齡:2
學(xué)號: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;
}

結(jié)果:

姓名:張三
年齡:0

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

姓名:王五
年齡:0
學(xué)號:20151653
純虛函數(shù)

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

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

但此時我們編譯

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


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

于是我們在子類中對它實現(xiàn)如下:
【Demo7】

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

class Student : public Person
{
public:
 //... 省略
 virtual void DoWork()
 {
 cout << "學(xué)習(xí)..." << 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;
}

   結(jié)果:

    教書…

    學(xué)習(xí)…
純虛函數(shù)用法要點:

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

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

相關(guān)文章

  • C語言指針的長度和類型深入分析

    C語言指針的長度和類型深入分析

    這篇文章主要介紹了C語言指針的長度和類型,針對常見的各個類型進行了相對詳細的分析,需要的朋友可以參考下
    2014-09-09
  • C語言中sizeof函數(shù)的基本使用總結(jié)

    C語言中sizeof函數(shù)的基本使用總結(jié)

    這篇文章主要給大家介紹了關(guān)于C語言中sizeof函數(shù)的基本使用的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-03-03
  • C++獲取MD5算法實現(xiàn)代碼

    C++獲取MD5算法實現(xiàn)代碼

    這篇文章主要介紹了C++獲取MD5算法實現(xiàn)代碼,這個是網(wǎng)上扒下來的 作者已經(jīng)無法知道是誰了 ,可以備用
    2019-04-04
  • C++?中的類型詳細

    C++?中的類型詳細

    這篇文章主要介紹了C++?中的類型,C++的類型很復(fù)雜,往往一個類型匹配錯誤就會導(dǎo)致程序報錯,本篇主要講解一些常用類型的概念以及細節(jié),需要的朋友可以參考一下,希望對你有所幫助
    2021-12-12
  • C語言文件操作詳解以及詳細步驟

    C語言文件操作詳解以及詳細步驟

    文件(file)一般指存儲在外部介質(zhì)上數(shù)據(jù)的集合,比如我們經(jīng)常使用的.txt,?.bmp,?jpg.?.exe,.rmvb等等,下面這篇文章主要給大家介紹了關(guān)于C語言文件操作的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-06-06
  • C++入門(命名空間,缺省參數(shù),函數(shù)重載,引用,內(nèi)聯(lián)函數(shù),auto,范圍for)

    C++入門(命名空間,缺省參數(shù),函數(shù)重載,引用,內(nèi)聯(lián)函數(shù),auto,范圍for)

    這篇文章主要介紹了C++入門(命名空間,缺省參數(shù),函數(shù)重載,引用,內(nèi)聯(lián)函數(shù),auto,范圍for),這些基礎(chǔ)知識是學(xué)習(xí)C++最最基礎(chǔ)需要掌握的知識點,需要的朋友可以參考下
    2021-05-05
  • C語言實現(xiàn)掃雷小游戲完整算法詳解(附完整代碼)

    C語言實現(xiàn)掃雷小游戲完整算法詳解(附完整代碼)

    掃雷游戲想必我們都有玩過,那么今天就用C語言來簡單實現(xiàn)“掃雷”小游戲,這篇文章主要給大家介紹了關(guān)于C語言實現(xiàn)掃雷小游戲完整算法的相關(guān)資料,文中給出了完整的實例代碼,需要的朋友可以參考下
    2022-06-06
  • C++數(shù)組指針和二維數(shù)組詳情

    C++數(shù)組指針和二維數(shù)組詳情

    這篇文章主要介紹了C++數(shù)組指針和二維數(shù)組,指針數(shù)組和二維數(shù)組在應(yīng)用中常用于函數(shù)傳參,下面我們就來看看指針數(shù)組和二維數(shù)組在應(yīng)用中的具體使用吧,需要的朋友可以參考一下
    2021-10-10
  • C++預(yù)定義的流對象基本示例詳解

    C++預(yù)定義的流對象基本示例詳解

    這篇文章主要為大家介紹了C++預(yù)定義的流對象基本示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-04-04
  • C++ 名稱空間詳情

    C++ 名稱空間詳情

    當(dāng)一個項目變得大型之后,我們會引入很多的庫,這么一來兩個庫很可能會定義List、Tree、Node同名的類,編譯器要是不考慮這情況的話,程序員調(diào)用時就會出現(xiàn)沖突問題。C++提供了名稱空間工具,以更好的控制名稱的作用域,本文就來談?wù)凜++ 名稱空間,需要的朋友可以參考一下
    2021-09-09

最新評論

韩城市| 盐池县| 桂平市| 敦化市| 仪陇县| 广水市| 德清县| 郸城县| 杭锦旗| 汉阴县| 隆回县| 威海市| 焉耆| 龙江县| 澜沧| 绍兴县| 昆山市| 德兴市| 绥化市| 桂阳县| 中山市| 治县。| 高密市| 靖边县| 高碑店市| 梁河县| 秭归县| 通化市| 招远市| 昆山市| 正定县| 辽阳县| 海安县| 肥乡县| 永寿县| 桃园县| 揭东县| 镇赉县| 喜德县| 高淳县| 璧山县|