一 对象构造:
(一)“无继承”情况下的对象构造
(二)“继承下”的对象构造
(三)vptr初始化语意学:
1.在一个class的constructor中,经由构造中的对象调用一个virtual function,其函数体应该是在此class中的那个virtual function版本。
2.决定一个类的virtual functions名单的关键是:virtual table。
*virtual table如何被处理:通过vptr。
*控制一个class中所用的函数,编译器只要简单的控制住vptr的初始化和设定操作即可。
3.vptr在constructor中应该何时被初始化:
*在base class constructor调用操作之后,但是在程序员提供的代码或是member initialization list中所列的members初始化操作之前。
4.constructor的执行步骤:
*在derived class construcot中,所有virtual base classes及上一层base class的constructors被调用;
*上述完成之后,对象的vptr(s)被初始化,指向相关的virtual table(s)。
*如果有member initialization list的话,将在constructor内扩展开来。这必须在vptr被设定之后进行,以免有一个virtual function被调用。
二 对象复制语意.
三 对象功能.
四 对象析构:
(1)编译器自动合成析构函数的情况(如果存在的则编译器扩展现有的destructor):
*class没有定义destructor,并且class内含的member object拥有destructor。
*class没有定义destructor,并且class的base class拥有destructor的情况下。
*注意:即使拥有虚函数,编译器也不自动合成destructor。
(2)destructor的执行步骤:
*destructor的函数本身先被执行。
*如果class拥有member class objects,而后者拥有destructors,那么它们会以其声明顺序的相反顺序被调用。
*如果object内带一个vptr,则现在被重新设定,执行适当的base class的virtual table。
*如果有任何直接的nonvirtual base classes拥有destructor,则以声明顺序的相反顺序被调用。
*如果有任何的virtual base classes拥有destructor,而当前的这个class是最尾端(most-derived)的class,那么它们以声明顺序的相反顺序被调用。