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