c++知識點面向?qū)ο?2)
4 、虛函數(shù)
1)引用或指針的靜態(tài)類型與動態(tài)類型不同這一事實正是C++語言支持多態(tài)性的根本所在。
2)基類中的虛函數(shù)在派生類中隱含地也是一個虛函數(shù)。當派生類覆蓋了某個虛函數(shù)時,該函數(shù)在基類中的形參必須與派生類中的形參嚴格匹配。
3)可以是函數(shù)的形參表后加override說明函數(shù)是派生類中的虛函數(shù),而用final用于說明不希望在繼承類中覆蓋該函數(shù)。
4)如果一個派生類虛函數(shù)需要調(diào)用它的基類版本,但是沒有使用作用域運算符,則在運行時該調(diào)用將被解析為對派生類版本自身的調(diào)用,從而導致無限遞歸。
double undiscounted = baseP->Quote::net_price(42);
5)如果我們通過基類的引用或指針調(diào)用函數(shù),則使用基類中定義的默認實參,即使實際運行的是派生類中的函數(shù)版本也是如此。
5 、抽象基類
1)在虛函數(shù)的形參表后加=0會讓虛函數(shù)變?yōu)榧兲摵瘮?shù),純虛函數(shù)本身不需要定義,它只是為派生類提供一個接口用于表示抽象普適的意義。值得注意的是,我們也可以為純虛函數(shù)提供定義,不過函數(shù)體必須定義在類的外部。
2)含有(或者未經(jīng)覆蓋直接繼承)純虛函數(shù)的類是抽象基類。抽象基類負責定義接口,而后續(xù)的其他類可以覆蓋該接口。我們不能定義一個抽象基類的對象。
3)派生類構(gòu)造函數(shù)只初始化它的直接基類。
6、 繼承情況下的類作用域
1)名字的查找發(fā)生在編譯階段,也就是說不論是對象,指針還是引用,都只能訪問它們靜態(tài)類型的成員。
2)當派生類中定義了同基類同名的成員時,基類中的成員將會被屏蔽,當然可以使用作用域操作符進行訪問。
3)在派生類中定義的同名函數(shù),就算形參不一樣,也會被屏蔽。原理同:局部作用域定義的函數(shù)不會重載全局作用域中定義的函數(shù)。
4)如果想讓派生類使用所有的重載成員,則在派生類里要么不定義,要么全定義。
7 、構(gòu)造函數(shù)與復制控制
因為派生類中實際上包含了基類的一些成員,所以這將會影響到派生類的構(gòu)造、復制、移動、賦值和撤銷。
7.1 構(gòu)造函數(shù)與繼承
構(gòu)造函數(shù)與復制控制成員不能繼承,每個類都必須有自己的構(gòu)造函數(shù)和復制控制成員。
但是在C++11中,派生類能夠和其直接基類定義的構(gòu)造函數(shù),但是也僅限于此,仍然不能繼承默認、拷貝和移動構(gòu)造函數(shù)。
派生類繼承基類構(gòu)造函數(shù)的方式是提供一條注明了基類名的using聲明語句,這樣對于基類的每個構(gòu)造函數(shù),編譯器都生成一個與之對應(yīng)的派生類的構(gòu)造函數(shù)。
class Bulk_qute : public Disc_quote{
public:
using Disc_quote::Disc_quote; // 繼承Disc_quote的構(gòu)造函數(shù)
double net_price(size_t) const;
};
如果派生類定義的構(gòu)造函數(shù)與基類構(gòu)造函數(shù)具有相同的參數(shù)列表,則該構(gòu)造函數(shù)將不會被繼承。
7.2 基類的構(gòu)造與復制控制函數(shù)
基類的構(gòu)造與復制函數(shù)基本不受影響,唯一的影響是,在確定哪些構(gòu)造函數(shù)時,需要考慮使用對象,可以在構(gòu)造函數(shù)前加protected,讓它只能在派生類中使用。
7.3派生類的構(gòu)造函數(shù)
1)合成的派生類默認構(gòu)造函數(shù)
兩個步驟:1,調(diào)用基類的默認構(gòu)成函數(shù)完成基類成員的初始化;2,用常規(guī)變量初始化規(guī)則初始化派生類的特有成員。
2)定義默認構(gòu)造函數(shù)
可以只給派生類的特有成員賦初值,而函數(shù)會隱式調(diào)用基類的構(gòu)造函數(shù)對基類成員進行定義。
3)向基類構(gòu)造函數(shù)傳遞實參
派生類的構(gòu)造函數(shù)初始化列表,不能直接初始化派生得到的成員,只能將基類包含在初始化列表中來間接初始化那些成員。
Bulk_item(const string& book, double sales_price, size_t qty = 0, double disc_rate = 0) : Item_base(book, sales_price), min_qty(qty), discount(dis_rate){}
4)只能初始化直接基類
在有多重繼承的性況下,派生類的構(gòu)造函數(shù)只能初始化自己的直接基類。
5)尊重基類接口
雖然可以在派生類的構(gòu)造函數(shù)體中直接訪問基類的public和protected成員,從而進行初始化,但是不要這樣做,而是使用基類提供的構(gòu)造函數(shù)接口。
7.3 復制控制和繼承
7.3.1 定義派生類的復制構(gòu)造函數(shù)
如果派生類顯式定義了自己的復制構(gòu)造函數(shù)或賦值操作符,則該定義將完全覆蓋默認定義?;惖牟糠忠脖仨氂膳缮惗x的函數(shù)來完成,不能希望有隱式的復制和賦值(這一點與構(gòu)造函數(shù)不同)。
在派生類復制構(gòu)造函數(shù)中,會顯式的調(diào)用基類的復制構(gòu)造函數(shù),因為它的形參是基類類型的引用,所以可以直接將派生類對象作為實參傳入。
如果沒有顯式調(diào)用,那么將會隱式地調(diào)用基類的默認構(gòu)造函數(shù)完成基類部分成員的定義,這樣最終得到的派生類對象就很奇怪了。
7.3.2 派生類賦值操作符
與復制構(gòu)造函數(shù)類似,必須顯式地調(diào)用基類的基類的賦值函數(shù)。
7.3.3 派生類的析構(gòu)函數(shù)
派生類析構(gòu)函數(shù)不負責撤銷基類對象的成員。編譯器總是顯式調(diào)用派生類對象基類部分的析構(gòu)函數(shù)。每個析構(gòu)函數(shù)只負責清除自己的成員。
7.3.4 虛析構(gòu)函數(shù)
Item_base *itemP = new Item_base;
delete itemP;
itemP = new Bulk_item;
delete itemP;
上面代碼中,在delete指向類的指針時,將調(diào)用析構(gòu)函數(shù),可是這里itemP可能指向基類也可能指向派生類,所以這時候應(yīng)該在運行階段根據(jù)類型去調(diào)用不同的析構(gòu)函數(shù)。
所以基類的析構(gòu)函數(shù)為虛函數(shù):virtual ~Item_base(){}
7.3.5 在構(gòu)造函數(shù)和析構(gòu)函數(shù)中調(diào)用虛函數(shù)
運行的是為構(gòu)造函數(shù)或析構(gòu)函數(shù)自身類型定義的版本。
看了“c++知識點面向?qū)ο?rdquo;的還看了:
1.c++程序設(shè)計心得體會3篇
2.java實習報告范文3篇
3.電大本科畢業(yè)論文范文
4.有關(guān)計算機畢業(yè)論文
5.“現(xiàn)代通信網(wǎng)”教學體系改革及考試評價論文
