个人建网站首选什么域名好,wordpress地址和找点地址,岳阳网站界面设计,泰安人力资源官网A* anew B ,delete a;会不会产生内存泄露了#xff0c;露了B-A的部分。其中B为A的子类 析构函数在下边3种情况时被调用#xff1a;1.对象生命周期结束#xff0c;被销毁时#xff1b;2.delete指向对象的指针时#xff0c;或delete指向对象的基类类型指针#xff0c;而其基…A* anew B ,delete a;会不会产生内存泄露了露了B-A的部分。其中B为A的子类 析构函数在下边3种情况时被调用1.对象生命周期结束被销毁时2.delete指向对象的指针时或delete指向对象的基类类型指针而其基类虚构函数是虚函数时3.对象i是对象o的成员o的析构函数被调用时对象i的析构函数也被调用。 情况1请看下边代码#includeiostream.hclass A{ public: A() { coutconstructing Aendl; } ~A() { coutdestructing Aendl; } private: int a;};class B: public A{ public: B() { coutconstructing Bendl; } ~B() { coutdestructing Bendl; } private: int b;}; void main(){ B b;} 运行结果为 constructing Aconstructing Bdestructing Bdestructing A 上述代码还说明了一件事析构函数的调用顺序与构造函数的调用顺序相反。 情况2则正好说明了为什么基类应该把析构函数声明为虚函数请先看下边的例子 #includeiostream.hclass A{ public: A() { coutconstructing Aendl; } ~A() { coutdestructing Aendl; } private: int a;};class B: public A{ public: B() { coutconstructing Bendl; } ~B() { coutdestructing Bendl; } private: int b;}; void main(){ A* a new B; delete a;} 运行结果为 constructing Aconstructing Bdestructing A 若将class A中的析构函数声明为虚函数运行结果将变成 constructing Aconstructing Bdestructing Bdestructing A 由此还可以看出虚函数还是多态的基础才c中没有虚函数就无法实现多态。因为不声明成虚函数就不能“推迟联编”所以不能实现多态。这点上和Java不同java总是“推迟联编”的所以也剩了这些麻烦。 扯远了再看情况3通过下边代码表示#includeiostream.hclass A{ public: A() { coutconstructing Aendl; } ~A() { coutdestructing Aendl; } private: int a;}; class C{ public: C() { coutconstructing Cendl; } ~C() { coutdestructing Cendl; } private: int c;}; class B: public A{ public: B() { coutconstructing Bendl; } ~B() { coutdestructing Bendl; } private: int b; C c;}; void main(){ B b;} 运行结果为 constructing Aconstructing Cconstructing Bdestructing Bdestructing Cdestructing A b的析构函数调用之后又调用了b的成员c的析构函数同时再次验证了析构函数的调用顺序与构造函数的调用顺序相反。 若将上边的代码中的main()函数内容改成 A* a new B; delete a; 由情况2我们知道这将不会调用class B的析构函数不会被调用所以class C的析构函数也不会被调用。正如我们想的运行结果为 constructing Aconstructing Cconstructing Bdestructing A 俗话说温故而知新我却不想做什么师只是希望能够和大家分享一下对析构函数和虚析构函数的更深的认识。以上代码在VC6.0上测试通过如有疏漏或错误的认识请大家指正转载于:https://www.cnblogs.com/dobben/p/7440913.html