|
在CU逛,别人问到这样的一个问题,大致如下:
#include <iostream> #include <string> using namespace std; class base { public: virtual void print(){cout<<"base::print()"<<endl;} //virtual ~base(){}//增加虚析构函数,将导致输出不一致。 }; class derived :public base { public: virtual void print(){cout<<"devrived::print()"<<endl;} }; int main(int argc, char *argv[]) { base* p1=&derived(); p1->print();
derived d; base* p2=&d; p2->print();
return 0; }
加入虚拟析构函数后,输出为: base::print() devrived::print() 不加入虚拟析构函数,输出则为: devrived::print() devrived::print()我的解释如下: 实际上,第一个赋值指向的是一个临时对象,加入与没有加入虚拟析构函数的区别在于:加入之后,在derived类中会合成一个析构函数以便调用base的虚拟析构函数,如果没有加入的话那么就不会合成这个析构函数,所有的资源在main函数结束之后才回收.
因此,对于代码: base* p1=&derived(); 没有加入虚拟析构函数的时候因为derived()函数生成的临时对象没有被销毁,因此对它的调用是对derived的调用;当加入虚拟析构函数之后,derived()函数生成的临时对象在以上的赋值完成之后就会调用析构函数进行析构,这个时候再次对p1调用print函数时,因为临时对象已经析构,那么这个调用就是对base的调用了.
我做了一个实验的代码,加了一些东西,大家看看~~
|