虛擬函式與多型知識點總結
阿新 • • 發佈:2018-11-19
虛擬函式和多型
1:多型性是指一個名字,多種語義;或介面相同,多種實現。
2:虛擬函式允許函式呼叫與函式體的聯絡在執行時才進行,稱為動態聯編。
3:實現執行時多型的關鍵首先是要說明虛擬函式,另外,必須用類指標呼叫派生類的不同實現版本
4:注意點:
①:一個虛擬函式,在派生類層介面相同的過載函式都保持虛特性
②:虛擬函式必須是類的成員函式
三:不能將友元說明為虛擬函式,但虛擬函式可以是另一個類的友元
④:解構函式可以是虛擬函式,但建構函式不能是虛擬函式。
5:虛擬函式的過載特性:
①:在派生類中過載基類的虛擬函式要求函式名、返回型別、引數個數、引數型別和順序完全相同
②:如果僅僅返回型別不同,C++認為是錯誤過載。如果函式原型不同,僅函式名相同,丟失虛特性
6:虛解構函式:
①:建構函式不能是虛擬函式。建立一個派生類物件時,必須從類層次的根開始,沿著繼承路徑逐個呼叫基類的建構函式
②:解構函式可以是虛的。虛解構函式用於指引 delete 運算子正確析構動態物件
7:建構函式、內聯成員函式、靜態成員函式不能是虛擬函式。
8:解構函式可以是虛擬函式,通常宣告為虛擬函式。
9:純虛擬函式和抽象類:
純虛擬函式是一種特殊的虛擬函式,在許多情況下,在基類中不能對虛擬函式給出有意義的實現,而把它宣告為純虛擬函式,它的實現留給該基類的派生類去做。
二:典型程式碼:
#include<iostream> using namespace std ; class Base { public : Base(char xx) { x = xx; } void who() { cout << "Base class: " << x << "\n" ; } protected: char x; } ; class First_d : public Base { public : First_d(char xx, char yy):Base(xx) { y = yy; } void who() { cout << "First derived class: "<< x << ", " << y << "\n" ; } protected: char y; } ; class Second_d : public First_d { public : Second_d( char xx, char yy, char zz ) : First_d( xx, yy ) { z = zz; } void who() { cout << "Second derived class: "<< x << ", " << y << ", " << z << "\n" ; } protected: char z; } ; int main() { Base B_obj( 'A' ) ; First_d F_obj( 'T', 'O' ) ; Second_d S_obj( 'E', 'N', 'D' ) ; Base * p ; p = & B_obj ; p -> who() ; p = &F_obj ; p -> who() ; p = &S_obj ; p -> who() ; F_obj.who() ; ( ( Second_d * ) p ) -> who() ; }