為什么要用多態
- 早期方法不利于擴展
- 開閉原則 開閉原則 對擴展開放 對修改關閉
- 利用多態實現—利于后期擴展,結構性非常好,可讀性高,效率稍微低,發生多態內部結構復雜
多態成立的條件
-
又繼承
-
子類重寫父類虛函數的函數:
a)返回值,函數名字,函數參數,必須和父類完全一致(析構函數除外)
b)子類中virtual關鍵字可寫可不寫,建議寫 -
類型兼容 父類指針,父類引用,指向子類對象
抽象基類和純虛函數
-
在設計時,常常希望基類僅僅作為其派生類的一個接口,這就是說,僅想對基類進行向上類型轉換,使用它的接口,
而不希望用戶實際的創建一個基類的對象,同時創建一個純虛函數允許接口中放置成員原函數,而不是要提供一段可能對這個函數毫無意義的代碼。 -
做到這點,可以在基類中加入至少一個純虛函數(pure virtual function),使得基類稱為抽象類(abstract class)
-
純虛函數使用關鍵字virtual,并在其后面加上=0,如果試圖去實例化一個抽象類,編譯器則會阻止這種操作。
-
當繼承一個抽象類的時候,必須實現所有的純虛函數,否則由抽象類派生的類也是一個抽象類
-
Virtual void fun()=0;告訴編譯器在vtable中為函數保留一個位置,但在這個特定位置不放地址
建立公共接口目的是為了將子類公共的操作抽象出來,可以通過一個公共接口來操縱一組類,且這個公共接口不需要事先(或者不需要完全實現)。可以創建一個公共類
#include<iostream>using namespace std;
/*
class Calculator
{
public:void setv1(int v){this->val1 = v;}void setv2(int v){this->val2 = v;}int getResult(string oper){if (oper == "+"){return val1 + val2;}else if (oper == "-"){return val1 - val2;}}private:int val1;int val2;
};
void test01()
{Calculator cal;cal.setv1(10);cal.setv2(10);cout << cal.getResult("+") << endl;cout << cal.getResult("-") << endl;
}
*///真正的開發中,有個開發原則,開閉原則
//對擴展開放 對修改關閉//利用多態實現計算器
class abstractCalculator
{
public:void setv1(int v){this->val1 = v;}void setv2(int v){this->val2 = v;}//virtual int getResult(){return 0;} 虛函數//純虛函數//如果父類中有了純虛函數 子類繼承了父類,必須要實現純虛函數//如果父類中 有了純虛函數,這個父類,就無法實例化對象了//這個類中有了純虛函數,通常又稱為 抽象類virtual int getResult() = 0;public:int val1;int val2;
};
//如果父類中有了純虛函數 子類繼承了父類,必須要實現純虛函數
class A :public abstractCalculator
{
public:virtual int getResult(){//return 0;}};//加法計算器
class PlusCaculator :public abstractCalculator
{
public:virtual int getResult(){return val1 + val2;}
};
//減法計算器
class SubCalculator : public abstractCalculator
{
public:virtual int getResult(){return val1 - val2;}
};//乘法計算器
class ChengCalculator : public abstractCalculator
{
public:virtual int getResult(){return val1*val2;}
};void test01()
{abstractCalculator *abc = new PlusCaculator;//加法計算器abc = new PlusCaculator;abc->setv1(10);abc->setv2(20);cout << abc->getResult() << endl;delete abc;abc = new SubCalculator;abc->setv1(10);abc->setv2(20);cout << abc->getResult() << endl;delete abc;abc = new ChengCalculator;abc->setv1(10);abc->setv2(20);cout << abc->getResult() << endl;//如果父類有了純虛函數,不能實例化對象了/*abstractCalculator aaa;abstractCalculator *abc = new abstractCalculator;*/
}int main()
{test01();system("pause");return 0;
}
- 純虛函數寫法 virtual void func()=0;
- 抽象類型
- 抽象類 不可實例化對象
- 如果類 繼承了抽象類,必須重寫抽象類中的純虛函數