有关虚函数(不能声明的和需要极力避免的)

首先看不能声明为virtual虚函数的情况:

  1. 普通函数(不能被覆盖)
  2. 友元函数(C++不支持友元函数继承)
  3. 内联函数(编译期间展开,虚函数是在运行期间绑定)
  4. 构造函数(没有对象不能使用构造函数,先有构造函数后有虚函数,虚函数是对对象的动作)
  5. 静态成员函数(只有一份大家共享)

再看需要避免的情况:

-简明概括:

先析构子类再析构父类,如果父类析构函数有虚函数,会导致调用子类的已经析构的内容。
先构造父亲类再构造子类,如果父类构造函数有虚函数,会导致调用子类还没构造的内容。

  • 避免构造函数声明为虚函数(如上)

    所谓虚函数就是多态情况下只执行一个,而从继承的概念来讲,总是要先构造父类对象,然后才能是子类对象,如果构造函数设为虚函数,那么当你在构造父类的构造函数时就不得不显示的调用构造,还有一个原因就是为了防错,试想如果你在子类中一不小心重写了个跟父类构造函数一样的函数,那么你的父类的构造函数将被覆盖,也即不能完成父类的构造.就会出错.

  • 避免构造函数中调用虚函数

    在构造函数不要调用虚函数。在基类构造的时候,虚函数是非虚,不会走到派生类中,既是采用的静态绑定。显然的是:当我们构造一个子类的对象时,先调用基类的构造函数,构造子类中基类部分,子类还没有构造,还没有初始化,如果在基类的构造中调用虚函数,如果可以的话就是调用一个还没有被初始化的对象,那是很危险的,所以C++中是不可以在构造父类对象部分的时候调用子类的虚函数实现。但是不是说你不可以那么写程序,你这么写,编译器也不会报错。只是你如果这么写的话编译器不会给你调用子类的实现,而是还是调用基类的实现。

  • 避免在析构函数中调用虚函数

    在析构函数中也不要调用虚函数。在析构的时候会首先调用子类的析构函数,析构掉对象中的子类部分,然后在调用基类的析构函数析构基类部分,如果在基类的析构函数里面调用虚函数,会导致其调用已经析构了的子类对象里面的函数,这是非常危险的。

  • 但是析构函数应该声明为虚的,因为需要动态绑定,从而析构掉子类中新增加的内容。

猜你喜欢

转载自blog.csdn.net/hyqsong/article/details/51880487