標籤:des style blog http java 使用 os ar
Typedef int (*healthcalcfunc)(const gamecharacter&)
當一個成員函數被聲明為虛函數後,其衍生類別中的同名函數都自動成為虛函數。因此,在子類從新聲明該虛函數時,可以加,也可以不加,但習慣上每一層聲明函數時都加virtual,使程式更加清晰。
友元函數 建構函式 static靜態函數 不能用virtual關鍵字修飾;
普通成員函數 和解構函式 可以用virtual關鍵字修飾;
virtual函數的效果
即用基類指標指向繼承類對象,接著便可以用該指標使用繼承類的成員函數。
class Base
{
public:Base(){}
public:
virtual void print(){cout<<"Base";}//可以不為空白
};
class Derived:public Base
{
public:Derived(){}
public:
void print(){cout<<"Derived";}
};
int main()
{
Base *point=new Derived();
point->print();
}
Output:
Derived
虛解構函式的作用:
用C++開發的時候,用來做基類的類的解構函式一般都是虛函數。可是,為什麼要這樣做呢
class ClxBase
{
public:
ClxBase() {};
virtual ~ClxBase() {};
virtual void DoSomething() { cout << "Do something in class ClxBase!" << endl; };
};
class ClxDerived : public ClxBase
{
public:
ClxDerived() {};
~ClxDerived() { cout << "Output from the destructor of class ClxDerived!" << endl; };
void DoSomething() { cout << "Do something in class ClxDerived!" << endl; };
};
代碼
ClxBase *pTest = new ClxDerived;
pTest->DoSomething();
delete pTest;
的輸出結果是:
Do something in class ClxDerived!
Output from the destructor of class ClxDerived!
這個很簡單,非常好理解。
但是,如果把類ClxBase解構函式前的virtual去掉,那輸出結果就是下面的樣子了:
Do something in class ClxDerived!
也就是說,類ClxDerived的解構函式根本沒有被調用!一般情況下類的解構函式裡面都是釋放記憶體資源,而解構函式不被調用的話就會造成記憶體流失。我想所有的C++程式員都知道這樣的危險性。當然,如果在解構函式中做了其他工作的話,那你的所有努力也都是白費力氣。
所以,文章開頭的那個問題的答案就是--這樣做是為了當用一個基類的指標刪除一個衍生類別的對象時,衍生類別的解構函式會被調用。
當然,並不是要把所有類的解構函式都寫成虛函數。因為當類裡面有虛函數的時候,編譯器會給類添加一個虛函數表,裡面來存放虛函數指標,這樣就會增加類的儲存空間。所以,只有當一個類被用來作為基類的時候,才把解構函式寫成虛函數。
虛函數和純虛函數
virtual void foo1();//虛函數
virtual void foo2() = 0;//純虛函數
虛函數為了重載和多態的需要,子類中可以重寫也可以不寫基類中的此函數!
純虛函數在基類中是沒有定義的,必須在子類中加以實現,很像java中的介面函數!
引入原因
1、為了方便使用多態特性,我們常常需要在基類中定義虛函數。(這點和虛函數一樣)
2、在很多情況下,基類本身產生對象是不合情理的。例如,動物作為一個基類可以派生出老虎、孔雀等子類,但動物本身產生對象明顯不合常理。
帶純虛函數的類叫虛基類,這樣的類也叫抽象類別。這種基類不能直接產生對象,而只有被繼承,並重寫其虛函數後,才能使用。