亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

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

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


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

普通成員函數(shù)

【Demo1】
根據(jù)這個(gè)類圖,我們有下面的代碼實(shí)現(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é)號(hào):" << m_studyId << endl;
 }

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

#endif //__OBJEDT_H__

測(cè)試代碼:

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é)號(hào):20151653
說明:
這里的ShowInfo就是一個(gè)普通的函數(shù)。pPerson、pTeacher和pStudent三個(gè)對(duì)象調(diào)用ShowInfo分別展示自己的信息。
我們知道:父類的指針是可以指向子類的對(duì)象的。我們把上面的測(cè)試代碼稍微改一下:
【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
這時(shí),pTeacher和pStudent只輸出了姓名和年齡,并沒有輸出子類所具有的特性(職稱和學(xué)號(hào))。這應(yīng)該不是你期望的結(jié)果,你可能期望pTeacher和pStudent輸出老師和學(xué)生的完整信息,這時(shí)就需要用虛函數(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】中的測(cè)試代碼,得到我們想到的結(jié)果:

姓名:張三
年齡:22

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

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

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

【Demo4】:針對(duì)第4點(diǎn)說明:

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(); //錯(cuò)誤,虛函數(shù)必須要有定義,即使是一個(gè)空實(shí)現(xiàn),因?yàn)榫幾g器無(wú)法確定會(huì)使用哪個(gè)函數(shù)


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

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

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

 //... 省略
};

測(cè)試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é)號(hào):20151653
測(cè)試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é)號(hào):20151653
純虛函數(shù)

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

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

但此時(shí)我們編譯

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


這句話時(shí)會(huì)報(bào)錯(cuò):error C2259: ‘Person' : cannot instantiate abstract class
這是因?yàn)槲覀儾]有為Person實(shí)現(xiàn)DoWork方法,而包含純虛函數(shù)的類是一個(gè)抽象的類,抽象類不能被實(shí)例化。

于是我們?cè)谧宇愔袑?duì)它實(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ù)用法要點(diǎn):

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

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

相關(guān)文章

最新評(píng)論