C++复习13.虚析构函数知识
2013-11-05 22:40
197 查看
C++ 虚析构函数 20131010
在C++中的虚函数作用是实现基于继承机制的多态,但是我们好像忽略了一种情况,就是虚析构函数。在C++继承机制中,虽然构造函数是不可以使用虚函数声明,但是析构函数是可以声明为虚函数的。这样做的目的是为了当父类指针指向一个派生类的对象的时候,当删除该指针的时候,可以调用派生类的析构函数,释放资源。如果不是这样的话,那么在C++中的派生类的内存空间是不会被释放掉,会造成内存的浪费,最终导致内存溢出而是程序崩溃。
但是我们不能够随意的使用虚函数声明,因为会增加类的存储空间,当我们声明一个函数式虚函数的时候,编译器会生成一个虚表中的函数指针,这样的话,如果 没有必要使用虚函数而使用了虚函数的话,会造成资源的浪费。
一个例子:
#include <iostream>
using namespace std;
class Base{
public:
Base(){
cout << "Base::constructor" << endl;
}
virtual ~Base(){
cout << "Base::~Base()" << endl;
}
};
class Derived:public Base{
public:
Derived(){
cout << "Derive::Constructor" << endl;
}
~Derived(){
cout << "Derived::~Derived()" << endl;
}
};
int main()
{
Base * pBase = new Derived();
delete pBase;
return 0;
}
这样才会争取的调去析构函数,而且是调用两个析构函数。
Base::constructor
Derive::Constructor
Derived::~Derived()
Base::~Base()
但是如果不适用虚函数的话,那么就会造成值会调用父类的析构函数,就结束了。
在C++中的虚函数作用是实现基于继承机制的多态,但是我们好像忽略了一种情况,就是虚析构函数。在C++继承机制中,虽然构造函数是不可以使用虚函数声明,但是析构函数是可以声明为虚函数的。这样做的目的是为了当父类指针指向一个派生类的对象的时候,当删除该指针的时候,可以调用派生类的析构函数,释放资源。如果不是这样的话,那么在C++中的派生类的内存空间是不会被释放掉,会造成内存的浪费,最终导致内存溢出而是程序崩溃。
但是我们不能够随意的使用虚函数声明,因为会增加类的存储空间,当我们声明一个函数式虚函数的时候,编译器会生成一个虚表中的函数指针,这样的话,如果 没有必要使用虚函数而使用了虚函数的话,会造成资源的浪费。
一个例子:
#include <iostream>
using namespace std;
class Base{
public:
Base(){
cout << "Base::constructor" << endl;
}
virtual ~Base(){
cout << "Base::~Base()" << endl;
}
};
class Derived:public Base{
public:
Derived(){
cout << "Derive::Constructor" << endl;
}
~Derived(){
cout << "Derived::~Derived()" << endl;
}
};
int main()
{
Base * pBase = new Derived();
delete pBase;
return 0;
}
这样才会争取的调去析构函数,而且是调用两个析构函数。
Base::constructor
Derive::Constructor
Derived::~Derived()
Base::~Base()
但是如果不适用虚函数的话,那么就会造成值会调用父类的析构函数,就结束了。
相关文章推荐
- C++基础知识复习之--顺序表学生成绩管理系统
- c++知识复习4.0
- C++复习 13 复制控制
- c\c++复习基础要点13---容器deque
- C++知识碎片整理(13)——extern
- C++基础知识复习&总结
- 复习C++基础知识-----“我的第一本C++”读书笔记3
- C++基础知识 课堂复习
- Day 4:C++基本语法知识回顾复习
- C++ 知识复习--一个简易围棋比赛系统
- 复习C++基础知识-----“我的第一本C++”读书笔记4(终篇)
- C++基础知识复习 const关键字
- C++基础知识复习--字符串
- C++基础知识复习--函数重载
- C++复习15.指针知识
- C++基础知识复习--结构体类数组作为函数参数
- c++知识复习7.0
- 【C++】学习、复习知识框架
- C++基础知识复习-【1】进制转换系列之16进制转10进制
- C++基础知识复习--运算符重载(非成员函数重载和成员函数重载)