为什么析构函数是虚函数

来源:互联网 发布:计算机二级vb 编辑:程序博客网 时间:2024/06/05 11:27
#include <iostream>using namespace std;class ClxBase{public:    ClxBase() {};    ~ClxBase() {cout << "Output from the destructor of class ClxBase!" << endl;};    void DoSomething() { cout << "Do something in class ClxBase!" << endl; };};class ClxDerived : public ClxBase{public:    ClxDerived() {};    ~ClxDerived() { cout << "Output from the destructor of class ClxDerived!" << endl; };    void DoSomething() { cout << "Do something in class ClxDerived!" << endl; };};int   main(){    ClxDerived *p =  new ClxDerived;    p->DoSomething();    delete p;    return 0;}

输出结果:
Do something in class ClxDerived!
Output from the destructor of class ClxDerived!
Output from the destructor of class ClxBase!
第二段程序

#include<iostream>using namespace std;class ClxBase{public:    ClxBase() {};    ~ClxBase() {cout << "Output from the destructor of class ClxBase!" << endl;};    void DoSomething() { cout << "Do something in class ClxBase!" << endl; };};class ClxDerived : public ClxBase{public:    ClxDerived() {};    ~ClxDerived() { cout << "Output from the destructor of class ClxDerived!" << endl; };    void DoSomething() { cout << "Do something in class ClxDerived!" << endl; }};  int   main(){    ClxBase *p =  new ClxDerived;  p->DoSomething();  delete p;  return 0;  }

结果:
Do something in class ClxBase!
Output from the destructor of class ClxBase!

这样由于使用的不是虚函数,这样删除只是删除一部分,会造成内存泄漏。执行的也是基类的函数。

#include<iostream>using namespace std;class ClxBase{public:    ClxBase() {};    virtual ~ClxBase() {cout << "Output from the destructor of class ClxBase!" << endl;};    virtual void DoSomething() { cout << "Do something in class ClxBase!" << endl; };};class ClxDerived : public ClxBase{public:    ClxDerived() {};    ~ClxDerived() { cout << "Output from the destructor of class ClxDerived!" << endl; };    void DoSomething() { cout << "Do something in class ClxDerived!" << endl; };};  int   main(){    ClxBase *p =  new ClxDerived;  p->DoSomething();  delete p;  return 0;  }

结果是
Do something in class ClxDerived!
  Output from the destructor of class ClxDerived!
  Output from the destructor of class ClxBase!
这段代码中基类的析构函数被定义为虚函数,在main函数中用基类的指针去操作继承类的成员,释放指针P的过程是:只是释放了继承类的资源,再调用基类的析构函数.调用dosomething()函数执行的也是继承类定义的函数. 如果不需要基类对派生类及对象进行操作,则不能定义虚函数,因为这样会增加内存开销.当类里面有定义虚函数的时候,编译器会给类添加一个虚函数表,里面来存放虚函数指针,这样就会增加类的存储空间.所以,只有当一个类被用来作为基类的时候,才把析构函数写成虚函

0 0