【深入探索c++对象模型】抽象类和纯虚函数的理解

参考【深入探索c++对象模型】析构、解构、拷贝语义学191-195页内容

纯虚函数是一种特殊的虚函数,在许多情况下,在基类中不能对虚函数给出有意义的实现,而把它声明为纯虚函数,它的实现留给该基类的派生类去做。这就纯虚函数的作用。其提出主要出于一下两方面的原因:
1、为了方便使用多态特性,我们常常需要在基类中定义虚函数。
2、在很多情况下,基类本身生成对象是不合情理的。例如,动物作为一个基类可以派生出老虎、孔雀等子类,但动物本身生成对象明显不合常理。
为了解决上述问题,引入了纯虚函数的概念,将函数定义为纯虚函数(方法:virtual ReturnType Function()= 0;)。若要使派生类为非抽象类,则编译器要求在派生类中,必须对纯虚函数予以重写以实现多态性。
包含纯虚函数的类称为抽象类。由于抽象类包含了没有定义的纯虚函数,所以不能定义抽象类的对象

对抽象类和纯虚函数,虚函数的一些问题的探讨。

(一)对于抽象类而言,是否应该自己负责初始化类内的数据成员?(别忘了抽象类也可以有非纯虚函数和数据成员)
class的data member应该被初始化,而且只在constructor中或其它member functions中初始化,其它任何操作都将破坏其封装性质,使其维护和修改更加困难。
(二)纯虚函数的调用
(a)可以定义和调用一个纯虚函数,但是只能够被静态的调用,不能由虚拟机制调用。
(b)这种调用完全有class的设计值自己决定。
(c)唯一的类外是pure virtua destructor,class设计者必须得定义它。原因是派生类的析构函数会被编译器进行扩充,以静态方式调用虚基类及更高层次的基类的
析构函数。若缺少任何一个基类的析构函数的定义,会是编译器产生链接错误。
(d)比较好的处理方法是:不要把virtual destructor 定义为pure。

虚基类的虚函数设置问题

(a)不加选择地将函数设定为virtual在效率上会不升反降,不能依赖编译器的优化。

虚基类的const设置问题。

(a)应付const也会令人头疼,例如在基类中不需要修改的const ref或者const pointer,到了子类就需要修改了。
(b)目前最好的方法是不用const。
参考博客http://wei.si/blog/2011/12/inside-com-study-notes-5-7/,对该仁兄学习态度给予敬意。

你可能感兴趣的:(【深度探索c++对象模型】)