首先看不能声明为virtual虚函数的情况:
- 普通函数(不能被覆盖)
- 友元函数(C++不支持友元函数继承)
- 内联函数(编译期间展开,虚函数是在运行期间绑定)
- 构造函数(没有对象不能使用构造函数,先有构造函数后有虚函数,虚函数是对对象的动作)
- 静态成员函数(只有一份大家共享)
再看需要避免的情况:
-简明概括:
先析构子类再析构父类,如果父类析构函数有虚函数,会导致调用子类的已经析构的内容。
先构造父亲类再构造子类,如果父类构造函数有虚函数,会导致调用子类还没构造的内容。
避免构造函数声明为虚函数(如上)
所谓虚函数就是多态情况下只执行一个,而从继承的概念来讲,总是要先构造父类对象,然后才能是子类对象,如果构造函数设为虚函数,那么当你在构造父类的构造函数时就不得不显示的调用构造,还有一个原因就是为了防错,试想如果你在子类中一不小心重写了个跟父类构造函数一样的函数,那么你的父类的构造函数将被覆盖,也即不能完成父类的构造.就会出错.
避免构造函数中调用虚函数
在构造函数不要调用虚函数。在基类构造的时候,虚函数是非虚,不会走到派生类中,既是采用的静态绑定。显然的是:当我们构造一个子类的对象时,先调用基类的构