虚成员函数与动态联编(摘自C++ Primerpuls)

虚成员函数与动态联编

首先请看下面的代码:

BrassPlus ophelia;
Brass *bp;
bp=&ophelia;
bp->viewAcct();

上述代码中,Brass类为基类,Brassplus为子类。 如果基类中没有将ViewAcct()声明为虚的,则bp->ViewAcct()将根据指针类型来调用父类中的同名函数,指针类型在编译的时候已经知道了,所以在编译器编译的时候,就可以该指针指向的函数关联了。总之编译器对非虚方法使用静态联编。
但是,若果在基类中将ViewAcct()声明为虚的,指针会根据对象的声明类型调用合适的函数。在这个例子中,对象声明类型在第一行,可见声明的是子类的对象,但通常只有在运行程序的时候才能确定对象的类型。所以编译器生成的代码将在程序执行的时候,根据对象类型进行关联。总之编译器对虚函数使用的是动态联编。

为什么有两种类型的联编以及为什么默认为静态联编

原因:效率和概念模型
首先来看效率。为了使程序能够在运行阶段进行决策,必须采取一些方法来跟踪基类指针或引用指向的对象类型,这增加了额外的处理开销。例如,如果类不会作用到基类上,则不需要动态联编。同样,如果派生类不重新定义基类的任何方法,也不需要使用动态联编。在这些情况下,使用静态联编更加合理,效率也比较高。由于静态联编效率更高,所以被设置为C++的默认选择。C++的指导原则之一就是,不要为不使用的特性付出代价,仅当程序设计确实需要虚函数的时候,才使用它们。
然后是概念模型。在设计类的时候,可能包含一些不在派生类中重新定义的成员函数,这些成员函数就没必要设置为虚函数,因为有两方面的好处,首先效率更高,其次指出不要重新定义该函数。这表明,仅将哪些预期将被重新定义的方法声明为虚的。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值