修改虚析构函数

This commit is contained in:
huihut 2018-04-04 01:14:22 +08:00
parent 9d34787bc1
commit 5ff3ab91ad

View File

@ -159,9 +159,9 @@ public:
{ {
cout << "I am Base\n"; cout << "I am Base\n";
} }
virtual ~Base(); virtual ~Base() {}
}; };
class Derived: public Base class Derived : public Base
{ {
public: public:
inline void who() // 不写inline时隐式内联 inline void who() // 不写inline时隐式内联
@ -176,14 +176,15 @@ int main()
Base b; Base b;
b.who(); b.who();
// 此处的虚函数是通过指针调用的,需要在运行时期间才能确定,所以不能为内联。 // 此处的虚函数是通过指针调用的,呈现多态性,需要在运行时期间才能确定,所以不能为内联。
Base *ptr = new Derived(); Base *ptr = new Derived();
ptr->who(); ptr->who();
// 因为Base有虚析构函数所以调用子类析构函数后也调用父类析构函数,防止内存泄漏。 // 因为Base有虚析构函数virtual ~Base() {}所以调用基类Base析构函数也调用派生类Derived析构函数,防止内存泄漏。
delete ptr; delete ptr;
ptr = nullptr; ptr = nullptr;
system("pause");
return 0; return 0;
} }
``` ```
@ -532,7 +533,7 @@ int main()
{ {
Shape * shape1 = new Circle(4.0); Shape * shape1 = new Circle(4.0);
shape1->calcArea(); shape1->calcArea();
delete shape1; //因为是虚析构函数,所以调用子类析构函数后,也调用父类析构函数。 delete shape1; //因为Shape有虚析构函数所以delete释放内存时调用基类析构函数也调用子类析构函数。
shape1 = NULL; shape1 = NULL;
return 0 return 0
} }