你能帮我解释一下C ++程序的结果吗?

时间:2016-01-09 07:31:02

标签: c++ virtual-functions

该程序的输出是:

  

A :: Fun C :: Do

为什么不是:

  

A :: Fun A :: do

主要是关于虚函数的工作原理,但我并不熟悉它,实际上我完全是C ++的新手,真的需要你的耐心,谢谢。

UITableViewConroller SummaryTableViewController

3 个答案:

答案 0 :(得分:2)

A中的任何一项功能都不是虚拟的。

所以在B中我们有:

  • 虚拟Do
  • 继承的非虚拟Fun
p.Fun

非常清楚它调用A::Fun

p.Do

它调用C::Fun因为:

  • DoB中是虚拟的,
  • C会覆盖Do
  • p是参考类型

答案 1 :(得分:1)

调用A::Fun()在编译时被解析为virtual。由于它不是A::Fun()函数,p.Do()也会在运行时执行。

调用B::Do()在编译时被解析为virtual。由于它是C函数,并且对应于真实对象的类型C::Do()具有重写的实现,因此android:theme="@style/Theme.AppCompat.Dialog"在运行时执行。

答案 2 :(得分:0)

输出结果为

A::Fun
C::Do

原因是B继承自A,然后类B没有自己的函数fun,所以非常期待。转到下一个输出,结果是即使引用类B调用Do,它也会成为对派生类C的调用,为什么会这样?

当方法变为虚拟时,调用不再决定调用它的对象的数据类型,而是决定对该方法的调用的地址。由于方法Do是虚拟的。电话现在在地址上,地址基本上属于' C',因此调用了C' s Do,我希望你能得到它。