构造函数中不能有虚函数的原因:
原因一:基类构造期间虚函数不会下降到派生类阶段,也就是本身我们声明一个派生类对象,它应该先去调用基类的构造,若此时基类构造里面有虚函数,则这个虚函数是基类的虚函数,而不是继而到派生类里的虚函数。(即:要求使用对象内部尚未初始化的成分。。。错误的)
原因二:在派生类构造的基类对象期间,对象类型是基类而不是派生类,派生类的专属成分并未被初始化。对象在派生类构造开始之前不会是一个派生类对象。
在构造和析构函数中不要用虚函数,因为这类函数调用不会下降至派生类。
也就是避免使用初期未成熟的派生类对象的未初始化成员变量。