【C++】C++中哪些函数不能被声明为虚函数

什么函数不能被声明为虚函数?

1、普通函数(非类成员函数);
2、构造函数;
3、内联函数;
4、静态成员函数;
5、友元函数;
6、不会被继承的基类的析构函数(没有必要)。

1、普通函数(非类成员函数)不能被声明为虚函数;
注意:只有类的成员函数才有可能被声明为虚函数。
因为普通函数(非成员函数)只能被重载,不能被重写。声明为虚函数也没有什么意思,因此编译器会在编译时绑定函数。
2、构造函数不能被声明为虚函数;
首先说下什么是构造函数,构造函数是用来初始化对象的。虚函数的主要作用是实现多态,多态是依托于类的,多态的使用必须是在类创建以后,而构造函数是用来创建构造函数的,所以不行。
具体原因:虚表指针的初始化时在构造函数进行的,而虚函数需要放到虚表中。在调用虚函数前,必须首先知道虚表指针,就互相矛盾了。
3、内联函数inline不能被声明为虚函数;
内联函数必须有实体,是在编译时展开。内联函数就是为了在代码中直接展开,减少函数调用花费的代价。虚函数是为了在继承后对象能够准确的执行自己的动作,这是不可能统一的。还有一点,inline内联函数是在编译时被展开,虚函数实在运行时才能动态的邦定函数。
4、静态成员函数不能被声明为虚函数;
静态成员函数理论是可继承的。但是静态成员函数是编译时确定的,无法动态绑定,不支持多态,因此不能被重写,也就不能被声明为虚函数。
5、友元函数不能被声明为虚函数;
原因:C++不支持友元函数的继承,不能继承的函数指定不是虚函数。
6、不会被继承的基类的析构函数没必要被声明为虚函数;
注意:析构函数可以是虚函数,而且通常声明为虚函数。
原因:首先,析构函数执行过程是:先调用派生类的析构函数,其次再调用基类的析构函数。所以,将可能会被继承的基类的析构函数设置为虚函数,可以保证当我们new一个子类,然后使用基类指针指向该子类对象,释放基类指针时可以释放掉子类的空间,防止内存泄漏。
但是为什么说不会被继承的基类的析构函数没必要被声明为虚函数呢?
虚函数的实现需要额外的虚函数表和虚表指针,占用额外的内存。而对于不会被继承的类来说,其析构函数如果是虚函数,就会浪费内存。因此只有当需要被当作基类时的析构函数才会被设置为虚函数。这也是为什么C++默认的析构函数不是虚函数的原因。

总结:
那么到底哪种函数不能被声明为虚函数呢?
其实有两点:
(1)不能被继承的函数;
(2)不能被重写的函数。

  • 3
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值