-
virtual使用的限制
查看全部 -
在多態(tài)的情況下虛函數(shù)表指針在對象當(dāng)中所占據(jù)的內(nèi)存位置是每個對象的前四個基本內(nèi)存單元
查看全部 -
接口類:
類中僅含有純虛函數(shù)
作用:表達一種能力或協(xié)議
查看全部 -
純虛函數(shù):
含有純虛函數(shù)的類叫做抽象類。
1、抽象類無法實例化對象
2、抽象類的子類只有把父類所有純虛函數(shù)都做了抽象,才可以實例化對象。
查看全部 -
typeid注意事項:
type_id返回一個type_info對象的引用
如果通過基類的指針獲得派生類的數(shù)據(jù)類型,基類必須帶有虛函數(shù)
只能獲取對象的實際類型
查看全部 -
dynamic_cast注意事項:
只能應(yīng)用與指針和引用的轉(zhuǎn)換
要轉(zhuǎn)換的類型中必須包含虛函數(shù)
轉(zhuǎn)換成功返回子類的地址,失敗返回NULL
查看全部 -
對象的大小是指在類實例化出的對象當(dāng)中,他的數(shù)據(jù)成員所占據(jù)的內(nèi)存大小,而不包括成員函數(shù)
查看全部 -
如果基類的析構(gòu)函數(shù)是虛函數(shù),這時只會看p所賦值的對象,如果p賦值的對象是派生類的對象,就會調(diào)用派生類的析構(gòu)函數(shù)(毫無疑問,在這之前也會先調(diào)用基類的構(gòu)造函數(shù),在調(diào)用派生類的構(gòu)造函數(shù),然后調(diào)用派生類的析構(gòu)函數(shù),基類的析構(gòu)函數(shù),所謂先構(gòu)造的后釋放);如果p賦值的對象是基類的對象,就會調(diào)用基類的析構(gòu)函數(shù),這樣就不會造成內(nèi)存泄露。
如果基類的析構(gòu)函數(shù)不是虛函數(shù),在delete p時,調(diào)用析構(gòu)函數(shù)時,只會看指針的數(shù)據(jù)類型,而不會去看賦值的對象,這樣就會造成內(nèi)存泄露。
查看全部 -
1、多態(tài)
定義:指相同對象收到不同消息 ? ? ?或 ?不同對象收到相同消息時產(chǎn)生的不同動作
2、靜態(tài)多態(tài)(早綁定) 和 動態(tài)多態(tài)(晚綁定)
靜態(tài)多態(tài):
(1)virtual 作用就是父類的指針指向子類的對象
(2)建立在繼承的基礎(chǔ)上 ?子類可以寫關(guān)鍵字 virtual 也可以不加,不加系統(tǒng)會自動添加(代碼的可讀性給加上)
(3)有new 就得有 delete
查看全部 -
面向?qū)ο蟮娜筇卣髦?/p>
1、啥事多態(tài)(1到多)
2、虛函數(shù)(純虛函數(shù) -- 抽象類接口類 )
普通虛函數(shù) ? 虛析構(gòu)函數(shù)
3、RTTI(運行時類別識別)
4、隱藏 ?覆蓋
5、早綁定 晚綁定
6、異常處理
查看全部 -
virtual在函數(shù)中的使用限制:
·普通函數(shù)不能是虛函數(shù)(編譯錯誤)
· 靜態(tài)成員函數(shù)不能是虛函數(shù)(編譯錯誤)
·內(nèi)聯(lián)函數(shù)不能是虛函數(shù)(可編譯,編譯器忽略inline關(guān)鍵字是函數(shù)變?yōu)榧兇馓摵瘮?shù))
·構(gòu)造函數(shù)不能是虛函數(shù)(編譯錯誤)
查看全部 -
通過虛析構(gòu)函數(shù)解決動態(tài)多態(tài)內(nèi)存泄漏問題
查看全部 -
定義一個動物(animal)類,要求含有虛函數(shù)eat和move,并定義構(gòu)造函數(shù)和虛析構(gòu)函數(shù)
定義一個狗(Dog)類,要求共有繼承動物類,定義構(gòu)造函數(shù)和虛析構(gòu)函數(shù),并實現(xiàn)自己的eat和move函數(shù)使用父類對象實例化子類,調(diào)用子類成員函數(shù)
#include <iostream>
#include <stdlib.h>
#include <string>
using namespace std;
/**
?*? 定義動物類:Animal
?*? 成員函數(shù):eat()、move()
?*/
class Animal
{
public:
? ? // 構(gòu)造函數(shù)
? ? Animal(){cout << "Animal" << endl;}
? ? // 析構(gòu)函數(shù)
virtual ~Animal(){cout << "~Animal" << endl;}
? ? // 成員函數(shù)eat()
virtual void eat(){cout << "Animal -- eat" << endl;}
? ? // 成員函數(shù)move()
virtual void move(){cout << "Animal -- move" << endl;}
};
/**
?* 定義狗類:Dog
?* 此類公有繼承動物類
?* 成員函數(shù):父類中的成員函數(shù)
?*/
class Dog : public Animal
{
public:
? ? // 構(gòu)造函數(shù)
Dog(){cout << "Dog" << endl;}
? ? // 析構(gòu)函數(shù)
virtual ~Dog(){cout << "~Dog" << endl;}
? ? // 成員函數(shù)eat()
virtual void eat(){cout << "Dog -- eat" << endl;}
? ? // 成員函數(shù)move()
virtual void move(){cout << "Dog -- move" << endl;}
};
int main(void)
{
? ? // 通過父類對象實例化狗類
Animal *p = new Dog();
? ? // 調(diào)用成員函數(shù)
p->eat();
? ? p->move();
? ? // 釋放內(nèi)存
? ? delete p;
? ? p = NULL;
? ??
return 0;
}
查看全部 -
在某一個類的定義中,其構(gòu)造函數(shù)中申請內(nèi)存,即存在"has a"的情況,析構(gòu)函數(shù)中釋放內(nèi)存。
如果在使用該類時涉及多態(tài)狀況,則會發(fā)生內(nèi)存泄漏,因為析構(gòu)函數(shù)中的釋放內(nèi)存沒有被運行到。
——虛析構(gòu)函數(shù):用virtual去修飾析構(gòu)函數(shù)
!1!普通函數(shù)不能是虛函數(shù),函數(shù)必須是某個類的成員函數(shù)
!2!靜態(tài)的成員函數(shù)不能是虛函數(shù)
!3!內(nèi)聯(lián)函數(shù)不能是虛函數(shù)
!4!構(gòu)造函數(shù)不能是虛函數(shù)
查看全部 -
靜態(tài)多態(tài)(早綁定):成員函數(shù)同名,但參數(shù)數(shù)目不同時,調(diào)用成員函數(shù)使用的參數(shù)個數(shù)決定了啟用不同的成員函數(shù)。
動態(tài)多態(tài)(晚綁定):以封裝和繼承為基礎(chǔ),父類指針指向子類類型時,要用virtual去修飾子類中已經(jīng)重定義的成員函數(shù)(虛函數(shù)),否則使用的是父類的定義的成員函數(shù);子類中的同名成員函數(shù)virtual可加可不加,系統(tǒng)默認(rèn)補全。
”父類指針指向子類對象,通過父類指針只能尋址到從父類繼承到的成員函數(shù)與數(shù)據(jù)成員,子類擴展的將會被截斷。但是,如果將父類中同名函數(shù)設(shè)置為虛函數(shù),創(chuàng)建子類對象時將會創(chuàng)建子類自有的虛函數(shù)表,虛函數(shù)表指向的成員函數(shù)將覆蓋父類中的同名函數(shù)?!?/p>
查看全部
舉報