本人学习C++不精,故重新学习,点滴记录与大家分享,不足之处还望大牛多多指教
。
条款7:为多态基类申明virtual析构函数
其实该条款在任何一门C++课堂上老师都会讲到,把基类的析构函数申明为virtual的,这样一来在接口释放时候子类才能被正真析构。
1、 先来看看编译器是如何帮我们实现的,对于基类析构函数不为虚函数的情况
代码和编译生成的汇编如下:


将父类的袖狗函数申明为虚函数以后

可以看到原来调用基类析构函数的地方变成了call eax,很明显是一个虚函数调用,跟进去一看就是子类的析构函数。
2、 第一个问题相信大部分人都没问题,但是是不是所有基类的析构函数都申明为虚函数呢?当然不是,该条款标题写的很明白只是为多态基类申明。因为有的时候会将一个类转换为一个特定的结构,如果定义了虚函数,那么这个类的开始地方就不再是第一个成员变量了,而是虚表的位置了,所以这么赋值就会出错。但是我在想这种用法其实不是很经常,总之不要画蛇添足吧。
3、 在C++中大家都习惯使用虚函数来实现接口,而且还是纯虚函数,通过一个抽象来来实现接口,在这里需要注意,如果析构函数是纯虚函数,必须有实现,否则会出现连接错误,代码如下:

434


&spm=1001.2101.3001.11974&articleId=7944585&d=1&t=3&u=477bc5d0a9f445e1873625dff2cd4eb7)

被折叠的 条评论
为什么被折叠?



