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