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