C++基類子類的解構函式
阿新 • • 發佈:2018-12-10
基類的解構函式不為虛擬函式
class Base {
public:
Base(int a = 0) {
cout << "Base default constructor" << endl;
p = new int(a);
}
~Base() {
cout << "Base destructor" << endl;
if (nullptr != p) {
delete p;
p = nullptr;
}
}
private :
int *p;
};
class Inherit : public Base {
public:
Inherit(int b = 0) {
cout << "Inherit default constructor" << endl;
q = new int(b);
}
~Inherit() {
cout << "Inherit destructor" << endl;
if (nullptr != q) {
delete q;
q = nullptr ;
}
}
private:
int *q;
};
基類對派生類及物件不需要進行操作時。
int main(void)
{
Base *b = new Base(2);
delete b;
b = nullptr;
return 0;
}
這時不能定義虛擬函式,因為這樣會增加記憶體開銷。當類裡面有定義虛擬函式時,編譯器會給類增加一個虛擬函式表,裡面來存放虛擬函式指標,這樣就增加了類的儲存空間。只有當一個類被用來作為基類的時候,才把解構函式寫成虛擬函式。
基類的解構函式為虛擬函式
class Base {
public :
Base(int a = 0) {
cout << "Base default constructor" << endl;
p = new int(a);
}
virtual ~Base() {
cout << "Base destructor" << endl;
if (nullptr != p) {
delete p;
p = nullptr;
}
}
private:
int *p;
};
class Inherit : public Base {
public:
Inherit(int b = 0) {
cout << "Inherit default constructor" << endl;
q = new int(b);
}
~Inherit() {
cout << "Inherit destructor" << endl;
if (nullptr != q) {
delete q;
q = nullptr;
}
}
private:
int *q;
};
示例
int main(void)
{
Base *b = new Inherit(3);
delete b;
b = nullptr;
return 0;
}