首先Virtual用于類的多態(tài),當設計一個類胳岂,用做其他類的父類時,且有Virtual修飾的方法舔稀,這些方法可被子類覆蓋定義乳丰,此時的析構(gòu)函數(shù)必須加Virtual。原因如下:上述場景一般使用工廠設計模式内贮,定義一個父類的指針产园,指向子類對象,而在delete 父類指針時夜郁,期望釋放對象什燕。但父類析構(gòu)函數(shù)不加Virtual修飾,則只會調(diào)用父類析構(gòu)函數(shù)竞端,而不調(diào)用子類析構(gòu)函數(shù)屎即,導致只釋放了對象的父類部分,而子類部分沒有釋放事富。Virtual含義就是有一個函數(shù)映射表技俐,調(diào)用時會去查映射表調(diào)用對應的方法。
例如:
class Test {
public:
Test(int test) : mTest(test){}
virtual ~Test(){
std::cout << "In ~Test" << std::endl;
}
virtual int getTest() {
return mTest++;
}
private:
int mTest;
};
class TestA : public Test {
public:
TestA(int test) : mTestA(test){}
~TestA(){
std::cout << "In ~TestA" << std::endl;
}
int getTest() {
return mTestA++;
}
private:
int mTestA;
}
class TestB : public Test {
public:
TestB(int test) : mTestB(test) {}
~TestB(){
std::cout << "In ~TestB" << std::endl;
}
int getTest(){
return mTestB++;
}
private:
int mTestB;
};
Test *pTest = new TestA(100);
......
delete pTest;
上述Test *pTest = new TestA(100);執(zhí)行后赵颅,父類Test的指針指向子類TestA對象虽另,在delete pTest時
將只會調(diào)用Test的析構(gòu)函數(shù),而不會調(diào)用TestA的析構(gòu)函數(shù)饺谬。
上述只是簡單驗證捂刺,一般使用時谣拣,可能涉及到多個子類,使用工廠方法族展,同樣會有這樣的問題森缠。因此
對于:父類有方法被子類被覆蓋的,同時使用的是指向父類的指針時仪缸,切記一定將父類析構(gòu)函數(shù)定義為virtual贵涵。
另一方面,如果一個類恰画,不會被繼承宾茂,則不應該定義析構(gòu)函數(shù)或者其他函數(shù)為virtual,否則會導致類的對象占用空間增大拴还。