必威体育Betway必威体育官网
当前位置:首页 > IT技术

虚函数

时间:2019-08-06 00:44:10来源:IT技术作者:seo实验室小编阅读:80次「手机版」
 

虚函数

拥有 virtual 关键字函数称之为虚函数

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

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

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

所以呢,这些函数不能成为虚函数;

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

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

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

那些函数可以成为虚函数呢?

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

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

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

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

Base *p = new Derive(10);
delete p;

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

相关阅读

分享到:

栏目导航

推荐阅读

热门阅读