-
如果父類中存在純虛函數(shù),而子類中并沒有實現(xiàn)此函數(shù),則子類便繼承了父類中的純虛函數(shù),成為和父類一樣的抽樣類,都不可以實例化對象。
查看全部 -
在同時接了多個接口類的子類中,必須把接口類中所有的虛函數(shù)進行實現(xiàn)
查看全部 -
常見異常情況
查看全部 -
異常處理關(guān)鍵字:
try...catch..(try是嘗試的意思,就是指嘗試運行正常的邏輯;catch是捕獲的意思,就是在try過程中出現(xiàn)異常,就會捕獲異常,進行處理)
throw(就是拋出異常的意思,拋出之后給catch進行捕獲)
這個基本思想就是主邏輯和異常處理邏輯進行分離!
查看全部 -
本質(zhì)上所有的操作系統(tǒng)都是一個死循環(huán),不停的接收以及響應(yīng)用戶的處理和給予反饋
真正的問題在于要分析清楚你所需要的所有資源的生命周期,包括內(nèi)存的申請和釋放,外設(shè)的創(chuàng)建和銷毀等等。只要是你申請的資源,你必須確認(rèn)他能夠及時正確的得到銷毀。
還有一點是既然死循環(huán)必須要考慮何時和怎樣釋放CPU,例如利用信號量等待將當(dāng)前任務(wù)/進程掛起,或者簡單的利用wait/sleep之類函數(shù)主動釋放。異常:程序在運行過程出現(xiàn)錯誤。
異常處理:對有可能發(fā)生異常的地方做出預(yù)見性的安排。
異常處理的基本思想:主邏輯與異常處理分離
try與catch是一對多的關(guān)系。
多態(tài)與異常處理的關(guān)系:Exception:HardwareErr,SizeErr,MemoryErr,NetworkErr
查看全部 -
用typeid函數(shù)的時候要#include <typeinfo>
查看全部 -
這個地方可以看到typeid(*obj).name() 打印出來的是class Bird進一步說明了typeid(X).name() 是識別X的數(shù)據(jù)類型,并非識別指針。
查看全部 -
typeid注意事項:
type_id返回一個type_info對象的引用;
如果想通過基類的指針獲得派生類的數(shù)據(jù)類型,基類必須帶有虛函數(shù);否則我們只能返回定義時所使用的的數(shù)據(jù)類型。
只能獲取對象的實際類型。(只能判斷當(dāng)前對象是基類還是子類,不能識別當(dāng)前指針是基類還是子類)
查看全部 -
dynamic_cast注意事項:
只能應(yīng)用與指針和引用的轉(zhuǎn)換
要轉(zhuǎn)換的類型中必須包含虛函數(shù)
轉(zhuǎn)換成功返回子類的地址,失敗返回NULL
查看全部 -
RTTI(Run-Time Type Identification,運行時類型識別),它使程序能夠獲取由基指針或引用所指向的對象的實際派生類型,即允許“用指向基類的指針或引用來操作對象”的程序能夠獲取到“這些指針或引用所指對象”的實際派生類型(通俗話來說,就是能夠知道這個基類指針糾結(jié)是被哪個派生類在用)
dynamic_cast是將一個基類對象指針(或引用)轉(zhuǎn)換到繼承類指針,dynamic_cast會根據(jù)基類指針是否真正指向繼承類指針來做相應(yīng)處理
typeid(*obj).name()來確定派生類指針類型。if(typeid(*obj).name() == typeid(Bird))進行指針比對。Bird *bird = dynamic_cast<Bird *>(obj)進行基類指針向派生類指針的轉(zhuǎn)換。
查看全部 -
當(dāng)類定義了虛函數(shù)之后,就會開拓一塊特殊的內(nèi)存VFtable虛函數(shù)表,虛函數(shù)表指針指向一個位置,這個位置中又放有各個虛函數(shù)實現(xiàn)的內(nèi)存的指針。
當(dāng)基類中定義虛函數(shù),子類繼承并獨特實現(xiàn)了同名虛函數(shù)后,虛函數(shù)表的指針就發(fā)生了變化,之后虛函數(shù)表中函數(shù)實現(xiàn)位置指針更加不同,就如圖中的0xCCFF
查看全部 -
接口類Flyable,沒有cpp文件,因為根本不需要去實現(xiàn)。 并且沒有構(gòu)造函數(shù)和析構(gòu)函數(shù),只有2個純虛函數(shù)。
構(gòu)造函數(shù)是用來實例化(或者叫構(gòu)造對象)用的, 而接口是不允許進行實例化的, 因此沒有構(gòu)造函數(shù)
接口類只含有純虛函數(shù),接口類不能被實例化,但可以有指向接口類的指針,以便于操縱各個子類。
查看全部 -
接口類定義:僅含有純虛函數(shù)的類(沒有數(shù)據(jù)成員,僅有成員函數(shù)且均為純虛函數(shù))
接口類更多的表達一種協(xié)議或能力
查看全部 -
Animal ();僅僅是聲明,類外要對其進行定義Animal::Animal(){};
而Animal(){};是在類內(nèi)定義
這個地方Animal的默認(rèn)構(gòu)造函數(shù)不能只寫成Animal();因為這樣寫只是申明了,沒有定義它(之前我們是在Animal.cpp里面定義了的),要定義它必須要加{}?。。。m然在定義里面我們什么都沒做?。?/p>
而在實例化對象Dog的時候,我們調(diào)用了這個默認(rèn)的父類構(gòu)造函數(shù)Animal(){} , 所以這里我們不加{}就會報錯。
但是在Dog類中,我們對默認(rèn)構(gòu)造函數(shù)寫成Dog(); 程序卻能夠正常運行,是因為我沒雖然沒有定義Dog(),但是我們也沒調(diào)用它。 我們調(diào)用的是函參的構(gòu)造函數(shù)Dog(string name){},所以才沒有報錯。
這個事情告訴我們,在沒有多個文件的的時候,聲明函數(shù)了一定要定義?。?/p>
查看全部 -
虛函數(shù)一定要有函數(shù)體:比如
virtial?void?eat(){cout?<<?"Animal--"?<<?m_strName?<<?"--?eat"?<<?endl;}
如果沒有后面的函數(shù)體,只寫成:virtial void eat();計算機會認(rèn)為這是一個純虛函數(shù),但是會報錯,因為純虛函數(shù)后面要寫=0。
查看全部
舉報