虚析构函数的使用
来源:互联网 发布:js广告代码 编辑:程序博客网 时间:2024/05/17 05:57
一、当你的类准备给别人继承时要提供虚析构函数
考虑下面例子:
class A
{
public:
A(){cout << "In A constructor" << endl;}
~A(){cout << "In A destructor" << endl;}
};
class B : public A
{
public:
B()
{
cout << "In B constructor" << endl;
m_p = new char[10];
}
~B()
{
cout << "In B destructor" << endl;
if (m_p) delete [] m_p;
}
private:
char *m_p;
};
int main(int argc, char* argv[])
{
//printf("Hello World!/n");
A *p = new B;//该句话注意一点,就是p是A类的指针,它虽然指向了继承A类的B类,但是该指针只能访问虚成员函数,不能访问B中普通成员函数。当A类与B类有相同的函数(什么都一样或者只是函数体不一样),此时p调用的也仅仅是A类中的函数。所以这样的调用只能访问B中重新定义A中的成员函数,并且这个成员函数是虚成员函数。
delete p;
return 0;
}
输出结果:
In A constructor
In B constructor
In A destructor
并没有调用B的析构函数,new出来的内存没有及时回收造成内存泄漏。
要解决这个问题,只要将A的析构函数定义为虚函数:~A(){cout << "In A destructor" << endl;}。为什么定义为虚函数就能解决呢?我是这样理解的:
象其它虚构函数一样,~B()重定义(overridden)了~A(),这样指向派生类的指针就能根据运行时的状态调用B的析构函数了。这里又有一个问题:为什么还会调用A的析构函数呢?我只能理解为析构函数是一个特殊的函数,由系统维护其机制。就像B.~A()是错误而B.~B()(虽然逻辑上不对,但语法上是正确的,编译运行完全没问题)是正确的一样。
因此,虚析构函数用在有虚函数的继承。否则,你那样的用法也是不正确的。A *p=new B 如果没有虚函数,会导致截断。
- 虚析构函数的使用
- 虚析构函数的使用
- 虚析构函数的使用
- 虚析构函数的使用条件
- 虚析构函数的使用(转载!)
- 关于虚析构函数的作用和使用
- 多态以及虚析构函数的使用
- 搞清虚析构函数的使用场合
- 使用excel的函数
- format函数的使用
- format函数的使用
- SetTimer函数的使用
- showModalDialog函数的使用
- 函数对象的使用
- DECODE函数的使用
- IIF函数的使用
- AnimateWindow()函数的使用
- count(*)函数的使用
- 设计模式总结
- 开开心心学算法--深度优先搜索(DFS)之滑雪问题
- C# winform与Javascript的相互调用
- linux 信号灯
- Unix环境高级编程学习笔记(四) 进程环境
- 虚析构函数的使用
- Ruby的require
- Fedora 15/16 安装后需要做的28件事
- 自由下载百度文库的文档
- 类的析构函数-C#
- 文字聊天hello world 远端共享对象方式
- cocos2d-x如何播放音乐和音效
- linux进程间通信(一)
- 华山论剑 --- 自定义UINavigationBar背景方法汇总