当前位置:   article > 正文

哪些函数可以成为虚函数,哪些函数不可以成为虚函数_类中哪些函数可以声明为虚函数,哪些不可以声明为虚函数

类中哪些函数可以声明为虚函数,哪些不可以声明为虚函数

一,什么是虚函数

拥有 Virtual 关键字的函数称之为虚函数

虚函数的作用是实现动态绑定的,也就是说程序在运行的时候动态的的选择合适的成员函数

那么,有哪些函数可以成为虚函数?那些函数不可以成为虚函数?

要成为虚函数必须满足两点,一就是这个函数依赖于对象调用,因为虚函数就是依赖于对象调用,因为虚函数是存在于虚函数表中,有一个虚函数指针指向这个虚表,所以要调用虚函数,必须通过虚函数指针,而虚函数指针是存在于对象中的。二就是这个函数必须可以取地址,因为我们的虚函数表中存放的是虚函数函数入口地址,如果函数不能寻址,就不能成为虚函数。

 

二,哪些函数不能成为虚函数?

1.内联函数:我们都知道内联函数只是在函数调用点将其展开,它不能产生函数符号,所以不能往虚表中存放,自然就不能成为虚函数。

2.静态函数:定义为静态函数的函数,这个函数只和类有关系,它不完全依赖于对象调用,所以也不能成为虚函数。

3.构造函数:都知道只有当调用了构造函数,这个对象才能产生,如果把构造函数写成虚函数,这时候我们的对象就没有办法生    成。更别说用对象去调用了。所以构造函数不能成为虚函数。

4.友元函数:友元函数不属于类的成员函数,不能被继承。对于没有继承特性的函数没有虚函数的说法。

5.普通函数:普通函数不属于成员函数,是不能被继承的。普通函数只能被重载,不能被重写,因此声明为虚函数没有意义。因为编译器会在编译时绑定函数。

 

三,哪些函数可以成为虚函数呢?

1.普通的成员方法是可以成为虚函数的

2.还有析构函数,因为析构函数是为了释放对象的,所以之前我们的对象已经生成,而且析构函数可以取地址,所以可以成为虚函数。

 

四,什么情况下,析构函数必须定义为虚函数。

当我们定义了一个基类指针,然后在堆上new了一个派生类的对象,让这个指针指向堆上开辟的这块内存。

  1. Base *p = new Derive(10);
  2. delete p;

如果基类的析构函数没有写成虚函数,delete这个基类指针,就不能释放掉堆上的派生类对象。因为delete p会调用基类的析构,你觉得调用基类的析构函数会释放掉派生类的对象吗?当然是不可能的。所以我们就要把基类的析构函数写成虚函数。写成虚函数后,当delete的时候,先会去基类调用析构函数,一看基类的析构函数是虚函数,就会自动的到派生类中调用派生类的析构函数。这时候派生类的对象就能释放了。
 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/731479
推荐阅读
相关标签
  

闽ICP备14008679号