定義:子類可以擴展父類的功能,但不能改變父類原有的功能。
通俗的講:軟件中使用一個父類,那麼一定適用其子類,而且它察覺不出父類和子類的區別。即,把父類替換成它的子類,軟件行爲沒有變化。其中有四層含義:
- 子類可以實現父類的抽象方法,但不能覆蓋父類的非抽象方法
- 子類中可以增加自己特有的方法
- 當子類的方法重載父類的方法時,方法的前置條件(即方法的形參)要比父類方法的輸入參數更寬鬆
- 當子類的方法實現父類的抽象方法時,方法的後置條件(即方法的返回值)要比父類更嚴格
舉例:老師類已經含有了getName函數,而語文老師類重新定義了getName函數,導致結構異常
老師類
// 頭文件定義
#include <string>
class Teacher
{
public:
Teacher();
virtual ~Teacher();
virtual void teach();
std::string getName();
void setName(std::string name);
private:
std::string name;
};
// 實現
std::string Teacher::getName()
{
return name;
}
語文老師類中新增information函數,及重新定義了getName函數
std::string ChineseTeacher::getName()
{
return "chinese";
}
void ChineseTeacher::information()
{
std::cout << "My name is " + getName() + "." << std::endl;
teach();
}
客戶端
#include "ChineseTeacher.h"
int main(int agrc, char* argv[])
{
ChineseTeacher chineseTh;
chineseTh.setName("zhangSan");
chineseTh.information();
getchar();
return 0;
}
運行結果
源碼地址