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