修改虚析构函数

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

View File

@ -155,36 +155,37 @@ using namespace std;
class Base
{
public:
inline virtual void who()
{
cout << "I am Base\n";
}
virtual ~Base();
inline virtual void who()
{
cout << "I am Base\n";
}
virtual ~Base() {}
};
class Derived: public Base
class Derived : public Base
{
public:
inline void who() // 不写inline时隐式内联
{
cout << "I am Derived\n";
}
inline void who() // 不写inline时隐式内联
{
cout << "I am Derived\n";
}
};
int main()
{
// 此处的虚函数who()是通过类Base的具体对象b来调用的编译期间就能确定了所以它可以是内联的但最终是否内联取决于编译器。
Base b;
b.who();
// 此处的虚函数who()是通过类Base的具体对象b来调用的编译期间就能确定了所以它可以是内联的但最终是否内联取决于编译器。
Base b;
b.who();
// 此处的虚函数是通过指针调用的,需要在运行时期间才能确定,所以不能为内联。
Base *ptr = new Derived();
ptr->who();
// 此处的虚函数是通过指针调用的,呈现多态性,需要在运行时期间才能确定,所以不能为内联。
Base *ptr = new Derived();
ptr->who();
// 因为Base有虚析构函数所以调用子类析构函数后也调用父类析构函数,防止内存泄漏。
delete ptr;
ptr = nullptr;
// 因为Base有虚析构函数virtual ~Base() {}所以调用基类Base析构函数也调用派生类Derived析构函数,防止内存泄漏。
delete ptr;
ptr = nullptr;
return 0;
system("pause");
return 0;
}
```
@ -532,7 +533,7 @@ int main()
{
Shape * shape1 = new Circle(4.0);
shape1->calcArea();
delete shape1; //因为是虚析构函数,所以调用子类析构函数后,也调用父类析构函数。
delete shape1; //因为Shape有虚析构函数所以delete释放内存时调用基类析构函数也调用子类析构函数。
shape1 = NULL;
return 0
}