[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?另外析構函數比較特殊,因爲派生類的析構函數跟基類的析構函數名稱不一樣,但
是構成覆蓋,這裏是因爲編譯器做了特殊處理)