虚函数使用注意事项

转载自:昵称:welkinwalker

定义:

在某基类中声明为 virtual 并在一个或多个派生类中被重新定 义的成员函数

作用:

虚函数主要是为了实现动态联编,也可以说是多态。在基类当中定义了虚函数,可以再子类中定义和基类中相同函数名、相同参数、相同返回值和不同实现体的虚函数,(只要在基类中定义成为虚函数,子类中无需加virtual也会成为虚函数),实现一个接口多种形态的变成,在动态联编当中,只能通过基类指针或基类对象来调用虚函数。 虚函数还有一个作用就是在开配动态内存是可以把基类的析构函数定义为虚的,这样可以使得开辟的堆空间被正确的释放,否则的话他只会调用基类的析构函数,不会调用子类的。 

不能被声明为虚函数的函数:   

普通函数(非成员函数)  因为普通函数只能被overload而不能被override,再说了把普通函数定义为虚函数没有生么实际的意义,因为函数在编译时会被帮顶个。 

构造函数:因为构造函数主要是为了初始化对象变量的,只有在生成一个对象之后才能发挥多态的作用。而虚函数是在运行的时候才起作用的。 

静态成员函数:因为静态成员函数只拷贝一份,所有代码共享,没有必要定义为虚函数。 

内联函数:内联函数是在编译的时候进行代码替换,而虚函数是在运行是实现的。即使把一个函数声明为内联函数,但编译器在编译的时候不一定当做内联函数。函数的inline属性是在编译时确定的, 然而,virtual的性质是在运行时确定的,这两个不能同时存在,只能有一个选择,文件中的inline关键字只是对编译器的建议,编译器是否采纳是编译器的事情。 

使用内联函数的时候要注意:1.递归函数不能定义为内联函数;2.内联函数一般适合于不存在while和switch等复杂的结构且只有1~5条语句的小函数上,否则编译系统将该函数视为普通函数;3.内联函数只能先定义后使用,否则编译系统也会把它认为是普通函数;4.对内联函数不能进行异常的接口声明。

友元函数: 友元函数不是类的成员函数不能被继承。

怎么检测一个标记为inline的函数是否被编译器当做内联函数来处理呢。这里提供一个方法:使用nm来查看调用内联函数的目标文件,如果找到了inline函数的符号,那么说明没有被当做内联函数,如果没有找到的话,则说明编译器把它当做了内联函数来处理。因为如果标记为inline的函数如果被当做了内联函数,编译器应当直接使用代码替换掉调用标记,所以不应当看到有内联函数的符号。(这个不会用)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值