C++中的多態詳解
阿新 • • 發佈:2018-04-22
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; }
看看多態的結果:
多態的的特性:
- 派生類重寫基類的虛函數實現多態,要求函數名、參數列表、返回值完全相同。(協變除外)
- 基類中定義了虛函數,在派生類中該函數始終保持虛函數的特性。
- 只有類的成員函數才能定義為虛函數。
- 靜態成員函數不能定義為虛函數。
- 如果在類外定義虛函數,只能在聲明函數時加virtual,類外定義函數時不能加virtual。
- 構造函數不能為虛函數,雖然可以將operator=定義為虛函數,但是最好不要將operator=定義為虛函數,因為容易使用時容易引
起混淆。 - 不要在構造函數和析構函數裏面調用虛函數,在構造函數和析構函數中,對象是不完整的,可能會發生未定義的行為。
- 最好把基類的析構函數聲明為虛函數。(why?另外析構函數比較特殊,因為派生類的析構函數跟基類的析構函數名稱不一樣,但
C++中的多態詳解