1. 程式人生 > >C++中的多態詳解

C++中的多態詳解

C++ 多態

[TOC]
#虛函數和多態

虛函數

定義:類的成員函數前面加virtual關鍵字,則這個成員函數稱為虛函數。

###代碼示例:

class Person
{
public:
    virtual void Buyticket()
    {
        cout << "買票—全價" << endl;
    }
protected:
    char* _name;
};

虛函數重寫

定義:當在子類的定義了一個與父類完全相同的虛函數時,則稱子類的這個函數重寫(也稱覆蓋)了父類的這個虛函數。

代碼示例:

class Person
{
public:
    virtual void Buyticket()
    {
        cout << "買票—全價" << endl;
    }
protected:
    char* _name;
};

class Student : public Person
{
public:
    virtual void Buyticket()
    {
        cout << "買票—半票" << endl;
    }
protected:
    char* _name;
};

##多態
###定義:一個對象呈現多種形態
###代碼示例:

class Person
{
public:
    virtual void Buyticket()
    {
        cout << "買票—全價" << endl;
    }
protected:
    char* _name;
};

class Student : public Person
{
public:
    virtual void Buyticket()
    {
        cout << "買票—半票" << endl;
    }
protected:
    char* _name;
};

void Fun(Person &p)//一個函數實現兩種形態
{
    p.Buyticket();
}

int main()
{
    Person p;
    Student s;
    Fun(p);
    Fun(s);
    system("pause");
    return 0;
}

看看多態的結果:
技術分享圖片

多態的的特性:

  1. 派生類重寫基類的虛函數實現多態,要求函數名、參數列表、返回值完全相同。(協變除外)
    1. 基類中定義了虛函數,在派生類中該函數始終保持虛函數的特性。
    2. 只有類的成員函數才能定義為虛函數。
    3. 靜態成員函數不能定義為虛函數。
    4. 如果在類外定義虛函數,只能在聲明函數時加virtual,類外定義函數時不能加virtual。
    5. 構造函數不能為虛函數,雖然可以將operator=定義為虛函數,但是最好不要將operator=定義為虛函數,因為容易使用時容易引
      起混淆。
    6. 不要在構造函數和析構函數裏面調用虛函數,在構造函數和析構函數中,對象是不完整的,可能會發生未定義的行為。
    7. 最好把基類的析構函數聲明為虛函數。(why?另外析構函數比較特殊,因為派生類的析構函數跟基類的析構函數名稱不一樣,但
      是構成覆蓋,這裏是因為編譯器做了特殊處理)

C++中的多態詳解