程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> C++之通俗成員函數、虛函數和純虛函數的差別與用法要點

C++之通俗成員函數、虛函數和純虛函數的差別與用法要點

編輯:關於C++

C++之通俗成員函數、虛函數和純虛函數的差別與用法要點。本站提示廣大學習愛好者:(C++之通俗成員函數、虛函數和純虛函數的差別與用法要點)文章只能為提供參考,不一定能成為您想要的結果。以下是C++之通俗成員函數、虛函數和純虛函數的差別與用法要點正文


通俗成員函數是靜態編譯的,沒有運轉時多態,只會依據指針或援用的“字面值”類對象,挪用本身的通俗函數;虛函數為了重載和多態的須要,在基類中界說的,即使界說為空;純虛函數是在基類中聲明的虛函數,它可以再基類中有界說,且派生類必需界說本身的完成辦法。

假定我們有三個類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. 假如虛函數應用默許實參,父類和子類界說的默許實參最好分歧。
  6. 【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. 包括純虛函數的籠統類經常使用來看成對外的接口,解釋這個類有甚麼功效,而沒有詳細的完成,基體的完成交由子類完成。
    4. 經由過程以上對通俗成員函數、虛函數和純虛函數的引見,願望可以對年夜家有所贊助。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved