-
多態(tài)的概念
查看全部 -
面向?qū)ο蟮娜筇卣鳎?1.封裝? 2.多態(tài)? 3.繼承
查看全部 -
父類函數(shù)如果用virtual修飾了,那么當(dāng)子類重載了該函數(shù)時(shí),會(huì)默認(rèn)加上virtual關(guān)鍵字;
父類析構(gòu)函數(shù)如果用virtual修飾了,那么子類析構(gòu)函數(shù)會(huì)默認(rèn)加上virtual關(guān)鍵字;基于此,當(dāng)父類指針指向子類對(duì)象時(shí),如果delete父類指針時(shí),會(huì)優(yōu)先調(diào)用子類的虛析構(gòu)函數(shù),然后自動(dòng)調(diào)用父類的虛析構(gòu)函數(shù)。查看全部 -
?
包含虛函數(shù)或虛析構(gòu)函數(shù)的類,會(huì)隱藏含有一個(gè)虛函數(shù)表指針的屬性,該指針指向虛函數(shù)表,虛函數(shù)表指針也是一個(gè)指針,占有4個(gè)基本內(nèi)存單元;
虛函數(shù)表是與類同時(shí)出現(xiàn)的,也就是說多個(gè)對(duì)象共享同一個(gè)虛函數(shù)表,虛函數(shù)表存儲(chǔ)虛函數(shù)的入口地址;
如果父類中有虛函數(shù),子類中沒有定義虛函數(shù),那么子類也會(huì)有一份自己的虛函數(shù)表,原因是子類可以從父類中繼承虛函數(shù),因此也需要維護(hù)一份虛函數(shù)表;
如果子類重新實(shí)現(xiàn)了父類的虛函數(shù),那么子類會(huì)將該虛函數(shù)的指針在子類的虛函數(shù)表里覆蓋父類的同名虛函數(shù),此時(shí)如果用父類指針指向子類對(duì)象,這時(shí)子類的虛函數(shù)表指針屬性會(huì)覆蓋父類的虛函數(shù)表指針,因此會(huì)調(diào)用到子類的虛函數(shù)。
?
查看全部 -
virtual在函數(shù)中的使用限制:
· 普通函數(shù)不能是虛函數(shù)????virtual int test(){}
· 靜態(tài)成員函數(shù)不能是虛函數(shù)????virtual static int getCount();
· 內(nèi)聯(lián)函數(shù)不能是虛函數(shù)????inline virtual int eat();
· 構(gòu)造函數(shù)不能為虛函數(shù)???
?class Animal
{
public:
????virtual Animal()
????{
????}
};
查看全部 -
思想:主邏輯和異常處理分離
try...catch...catch...catch......
常見異常
數(shù)組下標(biāo)越界
除數(shù)為0
內(nèi)存不足(多數(shù)內(nèi)存泄露造成)
查看全部 -
dynamic_cast<Bird *>(obj)
只能用于指針和引用的轉(zhuǎn)換
轉(zhuǎn)換的類型必須包含虛函數(shù),否則失敗
查看全部 -
純虛函數(shù) 沒有函數(shù)體 函數(shù)名之后加=0;
含有純虛函數(shù)的類叫抽象類
抽象類不能實(shí)例化對(duì)象
查看全部 -
函數(shù)覆蓋:派生類的虛函數(shù)覆蓋掉基類的虛函數(shù)
函數(shù)隱藏:同名函數(shù)
查看全部 -
虛析構(gòu)函數(shù)解決可能出現(xiàn)的內(nèi)存泄露問題
普通函數(shù)不能是虛函數(shù),不能修飾static成員函數(shù),不能修飾內(nèi)聯(lián)函數(shù),不能修飾構(gòu)造函數(shù)
查看全部 -
typeid 使用前包含庫#include <typeinfo>
dynamic_cast<需轉(zhuǎn)化類型>(被轉(zhuǎn)化類型)
(只能用于轉(zhuǎn)化指針類或引用)
查看全部 -
面向?qū)ο笕筇卣?/p>
查看全部 -
#include <iostream>
#include <stdlib.h>
#include <string>
#include<typeinfo>
using namespace std;
/**
?* 定義移動(dòng)類:Movable
?* 純虛函數(shù):move
?*/
class Movable
{
public:
??? virtual? void move()=0;
};
/**
?* 定義公交車類:Bus
?* 公有繼承移動(dòng)類
?* 特有方法carry
?*/
class Bus : public Movable
{
public:
??? virtual void move()
??? {
??????? cout << "Bus -- move" << endl;
??? }
?? ?
??? void? carry()
??? {
??????? cout << "Bus -- carry" << endl;
??? }
};
/**
?* 定義坦克類:Tank
?* 公有繼承移動(dòng)類
?* 特有方法fire
?*/
class Tank :public Movable
{
public:
??? virtual void move()
??? {
??????? cout << "Tank -- move" << endl;
??? }
??? void fire()
??? {
??????? cout << "Tank -- fire" << endl;
??? }
};
/**
?* 定義函數(shù)doSomething含參數(shù)
?* 使用dynamic_cast轉(zhuǎn)換類型
?*/
void doSomething(Movable *obj)
{
??? obj->move();
??? if(typeid(*obj)==typeid(Bus))
??? {
?????? Bus *bus=dynamic_cast<Bus *>(obj);
??????? bus->carry();
??? }
??? if(typeid(*obj)==typeid(Tank))
??? {
??????? Tank *tank=dynamic_cast<Tank*>(obj);
??????? tank->move();
??????? tank->fire();
??? }
}
int main(void)
{
??? Bus b;
??? Tank t;
??? doSomething(&b);
??? doSomething(&t);
??? return 0;
}查看全部 -
異常處理:
關(guān)鍵字
try ...catch...
throw
查看全部 -
RTTI:運(yùn)行時(shí)類型識(shí)別
dynamin_cast只能應(yīng)用于指針和引用的轉(zhuǎn)換,要轉(zhuǎn)換的類型中必須包含虛函數(shù),若轉(zhuǎn)換成功則返回子類的地址,失敗返回NULL.
type_id返回一個(gè)type_info對(duì)象的引用,如果想通過基類的指針獲得派生類的數(shù)據(jù)類型,基類必須帶有虛函數(shù), 只能獲取對(duì)象的實(shí)際類型。
查看全部
舉報(bào)