虚函数的注意事项

虚函数是为了实现多态特性的。虚函数的调用只有在程序运行的时候才能知道到底调用的是哪个函数,

虚函数的作用在于通过父类的指针或者引用来调用它的时候能够变成调用子类的那个成员函数。

  • 什么时候析构函数得写成虚函数

当一个类被用来作为基类的时候,才把析构函数写成虚函数.

因为如果这个类被其他类继承但并没有把析构函数写成虚函数,若定义一个父类的指针指向子类,当释放这个指针时的过程是:只是释放了父类的资源,而没有调用继承类的析构函数,造成内存泄漏.。

如果不需要父类对继承类及对象进行操作,则不能定义虚函数,因为这样会增加内存开销.当类里面有定义虚函数的时候,编译器会给类添加一个虚函数表,里面来存放虚函数指针,这样就会增加类的存储空间。

  • 构造函数不能写成虚函数

构造函数是在创建对象时自动调用的,不可能通过父类的指针或者引用去调用,因此也就规定构造函数不能是虚函数。

虚函数对应一个虚函数表,这个虚函数表是存储在对象的内存空间的。如果构造函数是虚的,就需要通过 虚函数表来调用,但对象还没有实例化,也就是内存空间还没有,更不要说在虚函数表中调用了,所以构造函数不能是虚函数。

  • inline函数不能写成虚函数

inline是在编译期将函数类容替换到函数调用处,是静态编译的。而虚函数是动态调用的,在编译期并不知道需要调用的是父类还是子类的虚函数,所以不能够inline声明展开,所以编译器会忽略。

 

  • 静态函数不能同时成为虚函数

主要涉及静态函数和虚函数的编译时机的不同。static函数在编译时候就绑定成功,而虚函数则要在运行时才能确定下来。虚函数,是一种特殊的成员函数,用来实现运行时多态。virtual函数一定要通过对象来调用,有隐藏的this指针。static函数没有this指针,属于类而不属于具体对象,因此static函数无法通过对象来调用。因此二者是不能同时成立的。

扫描二维码关注公众号,回复: 5508123 查看本文章

猜你喜欢

转载自blog.csdn.net/L_jiahao/article/details/86088139