纯虚函数的存在:
它只能被静态调用,不能经由虚拟机制调用。
惟一的例外是纯虚函数的析构函数:每一个继承的析构函数被编译器扩展,以静态方式调用其每一个virtual base class以及上一层的base class的析构函数。只要缺乏任何一个的定义就会导致链接失败。
准则:接口不const ,析构函数不是纯析构
关于构造函数里面的内容:
初始化列表,虚函数表的指针,继承来的所有构造函数。
1.在derived class constructor中,所有的virtual base class以及上一层的base class的Construct会被调用。
2.上诉完成后,对象的vptr被初始化,指向相关的table
3.如果有Members initialization的话,将在Construct体内扩展开来,这必须在vptr设定之后才做,以免有一个virtual member function被调用。
4.最后,执行所提供的代码。
如果调用操作限制必须在Construct或destructor中直接调用,那么必须将调用以静态方式决议,千万不要用到虚拟机制。在哪一个类中构造就调用哪一个,嵌入调用同样。
拷贝:如果想拒绝,则声明为私有。(除了在成员函数中或者友员函数);
建议:不要允许一个virtual base class的拷贝操作或者有任何数据。
析构函数:
如果class没有定义析构函数,那么只有在Class内含的Members Object或者基类拥有析构函数的情况下,编译器才会合成一个出来。
执行顺序:
析构的函数本体先被执行,以构造调用相反的顺序。
析构然后重新设定虚表。指向适当的base class的虚表。