这个问题很多人一定都知道,但是我想其中的原理可能知道的人就不多了,这里我也是现学现卖,最近一直在研究C++的模型。正好借此机会为大家分享下我的学习心得
比较死笨的方法就是记住,基类一定要声明虚函数,才能做为基类,如果你的类中不打算拥有虚函数,那最好就不要让其作为基类,原因我想大家都知道了.可是如果基类的析构不声明为virtual函数的话,也将导致dervied类对象赋值给基类指针实现多态的时候导致局部析构的问题出现,这点大家一定也都明白我这就稍微提一下,关键的问题在这抛出————为什么声明了虚的析构函数,当delete基类指针的时候,也能够把derived对象的数据清楚呢?
我们先看下C++是如何实现多态机制的。
所谓多态,也可以说是动态绑定,意思就是,在程序编译期,是无法知道所声明定义的指针的确切行为是什么。只有在运行期才能知道指针确切的指向对象是什么,从而才能通过该指针正确的调用其所指对象的行为。那C++是如何知道该指针应该去调用什么行为呢?
原来,在C++类中申明了虚函数方法后,编译器会在编译时对该类的内存分配上多分配出一个指针,这个指针就是我们所熟知的vptr了,它指向一个vtable(即虚表),这个虚表里其实就是这个类所申明的虚函数。这么一来可以想象,当dervied类编译的时候,重载了基类中的虚函数方法的并且还有自己定义的其他非基类虚函数方法的话,自然这个类编译器会为它指定两个vptr和vtable,第一个是继承自基类的,第二个是编译器为它生成的。
这样,重载了的基类方法的函数,会在derived类的基类位置的vtable中覆盖原来继承而来的函数。
而C++还使derived类的析构函数,由于基类的析构是虚的缘故,也覆盖了原来基类的vtable中的析构函数。这么一来自然在讲dervied对象付给基类指针后,对其进行delete,调用的就是子类的析构方法了,随后才会按顺序调用基类的析构。
所以这么一来,可以看到,不会在存在局部对象未被析构的怪异问题了
今天的总结就到这里!如果有牛人觉得我说的不对欢迎留言讨论
阅读(1852) | 评论(0) | 转发(0) |