关于c++虚析构函数

先介绍一下虚函数
虚函数的作用是实现动态联编,也就是在程序的运行阶段动态地选择合适的成员函数,在定义了虚函数后,可以在基类的派生类中对虚函数重新定义,在派生类中重新定义的函数应与虚函数具有相同的形参个数和形参类型。以实现统一的接口,不同定义过程。如果在派生类中没有对虚函数重新定义,则它继承其基类的虚函数。
 
析构函数呢
在类的对象脱离作用域是,自动执行的函数。主要做些清理工作。
这是一句基础:派生类执行完自己的析构函数后,会自动执行父类的析构函数。(好久不看书,都忘了,理解得不太好)
 
现在就是虚析 构函数
析 构函数 前加上virtual 就是了。 不过这过程要创建一个虚函数表。。。占用空间。。简单说就写个例子
class A
{
public:
 A(){printf("In A constructor\n");}
 virtual  void display(){printf("A des\n");}
  virtual  ~A(){printf("In A destructor\n");}
};
class B : public A
{
public:
 B()
 {
  printf("In B constructor\n");
  m_p = new char[10];
 }
 void display(){printf("B des\n");}
 ~B()
 {
  printf("In B destructor\n");
  if (m_p) delete [] m_p;
 }
private:
 char *m_p;
};
void test()
{
 A *p = new B;
    p->display();
 delete p;
}
int _tmain(int argc, _TCHAR* argv[])
{
 char * str1;
 str1 = new char[10];
 test();
 scanf("%s",str1);
 delete [] str1;
 return 0;
}
这样的结果就是
In A constructor
In B constructor
B des
In B destructor
In A destructor
这样是很正确的;但是去掉 virtual  void display(); virtual  ~A();的virtual,是什么样子呢?
结果就变成这样
In A constructor
In B constructor
A des
In A destructor
首先display 不是想要的结果。。
class B 的destructor没有执行。。。没有释放new的空间。。内存泄漏。。
这就是虚函数吧。。如果想用多态性还要小心,记得使用virtual

本文出自 “漂流中。。。” 博客,谢绝转载!

你可能感兴趣的:(C++,职场,休闲,虚析构函数)