4.7 多型
4.7.1 多型的基本概念
多型是c++物件導向三大特性之一,多型分為兩類:靜態多型、動態多型。
靜態多型:函式過載和運算子過載屬於靜態多型,復用函式名
動態多型:派生類和虛函式實現執行時多型
區別:靜態多型的函式位址早繫結 - 編譯階段確定函式位址
動態多型的函式位址晚繫結 - 執行階段確定函式位址
#includeusing總結:多型滿足條件namespace
std;
//多型
//動物類
class
animal
};//
貓類class cat :public
animal
};//
狗類class dog :public
animal
};//
執行說話的函式
//位址早繫結 在編譯階段確定了函式位址
//如果想執行讓貓說話,那麼這個函式位址就不能提前繫結,需要在執行階段進行繫結,既位址晚繫結 改為虛函式即可
//動態多型滿足條件:1、有繼承關係 2、子類重寫父類的虛函式
//動態多型使用 父類的指標或引用 執行子類物件
void dospeak(animal &animal) //
animal &animal = cat -> animal的引用指向cat 父類的引用指向子類
void
test1()
intmain()
1、有繼承關係
2、子類重寫父類中的虛函式
多型使用條件
1、父類指標或引用
//分別用普通寫法和多型技術 實現計算器
//普通寫法
class
calculator
else
if(oper == "-"
)
else
if (oper == "*"
)
else
if (oper == "/"
)
//如果想擴充套件新功能,需要修改原始碼
//在真實開發中 提倡 開閉原則
//開閉原則:對擴充套件進行開放,對修改進行關閉
}
int m_num1; //
運算元1
int m_num2; //
運算元2
};//
多型技術
//多型好處:1、組織結構清晰 2、可讀性強 3、對於前後期的維護和擴充套件高
//實現計算器抽象類
class
abstractcalculator
intm_num1;
intm_num2;
};//
加法計算器類
class addcalculator :public
abstractcalculator
};//
減法計算器類
class subcalculator :public
abstractcalculator
};//
乘法計算器類
class mulcalculator :public
abstractcalculator
};//
除法計算器類
class chucalculator :public
abstractcalculator
};void
test1()
void
test2()
intmain()
4.7.3 純虛函式和抽象類
在多型中,通常父類中虛函式的實現是毫無意義的,主要都是呼叫子類重寫的內容,因此可以將虛函式1改為純虛函式。
純虛函式語法:virtual 返回值型別 函式名 (引數列表)= 0;
當類中有了純虛函式,這個類也稱為抽象類。
抽象類特點:
1、無法例項化物件
2、子類必須重寫抽象類中的純虛函式,否則也屬於抽象類
#includeusing案例 做飲料namespace
std;
class
base
;class son :public
base;};
void
test1()
intmain()
#includeusing4.7.5 虛析構和純虛析構namespace
std;
//多型案例2 製作飲品
class
abstractdrinking
};//
製作咖啡
class coffee :public
abstractdrinking
//沖泡
virtual
void
brew()
//倒入杯中
virtual
void
pourincup()
//加入佐料
virtual
void
putsomething()
};//
製作茶葉水
class tea :public
abstractdrinking
//沖泡
virtual
void
brew()
//倒入杯中
virtual
void
pourincup()
//加入佐料
virtual
void
putsomething()
};//
製作void dowork(abstractdrinking * abs) //
abstractdrinking * abs = new coffee
void
test1()
intmain()
多型使用時,如果子類中有屬性開闢到堆區,那麼父類指標在釋放時無法呼叫到子類的析構**
解決辦法:將父類中的析構函式改為虛析構或者純虛析構
虛析構和純虛析構共性:
1、可以解決父類指標釋放子類物件
2、都需要具體的函式實現
區別:如果是純虛析構,該類屬於抽象類,無法例項化物件
虛析構語法: virtual ~類名(){}
純虛析構語法:virtual ~類名() = 0
#include#include案例2 電腦組裝using
namespace
std;
//虛析構和純虛析構
class
animal
////利用虛析構可以解決 父類指標釋放子類物件時不乾淨的問題
//virtual ~animal()
//
//純虛析構 需要宣告也需要實現
//有了純虛析構之後 這個類也屬於抽象類 無法例項化物件
virtual ~animal() = 0; //
如果沒有第27-30行的類外宣告,**將無法執行 因為沒實現就不能執行父類的析構
//純虛函式
virtual
void speak() = 0;};
animal::~animal()
class cat :public
animal
virtual
void
speak()
~cat()
}string *m_name;
};void
test1()
intmain()
C 核心程式設計 4 類和物件 封裝
c 物件導向的三大特性 封裝 繼承 多型 c 認為萬事萬物皆為物件,物件上有其屬性和行為 封裝意義 1 將屬性和行為作為乙個整體,表現生活中的事物 語法 class 類名 例項 設計乙個圓類,求圓的周長 include include using namespace std 設計乙個圓類,求圓的周長...
C 核心程式設計 4 類和物件 友元
黑馬程式設計師匠心之作 c 教程從0到1入門程式設計 學習筆記 本階段主要針對c 物件導向程式設計技術做詳細講解,c 中的核心和精髓 在程式裡,有些私有屬性,也想讓類外特殊的一些函式或者類進行訪問,就需要用到友元的技術。友元的目的就是讓乙個函式或者類,訪問另乙個類中的私有成員。友元的關鍵字為frie...
C 核心程式設計 04類和物件 封裝
c 物件導向程式設計的三大特徵為 封裝 繼承 多型 c 認為萬事萬物皆為物件,物件上有其屬性和行為 封裝是c 物件導向三大特性之一 封裝的意義 1 將屬性和行為作為乙個整體,表現生活中的事物 2 將屬性和行為加以許可權控制 封裝意義一 在設計類的時候,屬性和行為寫在一起,表現事物 語法 class ...