读书笔记:Effective C++ 2.0 版,条款13(初始化顺序==声明顺序)、条款14(基类有虚析构)

条款13: 初始化列表中成员列出的顺序和它们在类中声明的顺序相同
类成员是按照它们在类里被声明的顺序进行初始化的,和它们在成员初始化列表中列出的顺序没一点关系。
根本原因可能是考虑到内存的分布,按照定义顺序进行排列。
另外,初始化列表可以有多个。
基类数据成员总是在派生类数据成员之前被初始化,所以使用继承时,要把基类的初始化列在成员初始化列表的最前面。
如果使用多继承,基类被初始化的顺序和它们被派生类继承的顺序一致,它们在成员初始化列表中的顺序会被忽略。多继承的内存分布估计也与被派生类继承的顺序一致。
静态数据成员的行为有点象全局和名字空间对象,所以只会被初始化一次(详见条款47)。

条款14: 确定基类有虚析构函数
c++语言标准:当通过基类的指针去删除派生类的对象,而基类又没有虚析构函数时,结果将是不可确定的。声明析构函数为虚就会带来你所希望的运行良好的行为:对象内存释放时,基类和派生类的析构函数都会被调用。

如果某个类不包含虚函数,那一般是表示它将不作为一个基类来使用。

vptr(虚函数表指针)的指针。vptr指向的是一个称为vtbl(虚函数表)的函数指针数组。每个有虚函数的类都附带有一个vtbl。vptr伴随着对象存在,new的时候确定,运行时才不会混淆基类派生类。

虚析构函数工作的方式是:最底层的派生类的析构函数最先被调用,然后各个基类的析构函数被调用。即使是抽象类,编译器也要产生对纯虚析构函数的调用,所以要保证为纯虚析构函数提供函数体。

如果声明虚析构函数为inline,将会避免调用它们时产生的开销,但编译器还是必然会在什么地方产生一个此函数的拷贝。

你可能感兴趣的:(cpp,c++)