提问人:Jigar Patel 提问时间:2/8/2023 最后编辑:Jigar Patel 更新时间:2/8/2023 访问量:132
C++ 继承中的虚函数
Virtual function in Inheritance in C++
问:
**阅读以下提及代码**
#include<iostream>
using namespace std;
class FR
{
public :
virtual int fun()
{
cout<<"In FR Class "<<endl;
}
int Threading()
{
fun();
}
};
class FD : public FR
{
public :
int fun()
{
cout<<" In FD class "<<endl;
}
};
int main()
{
FD obj ;
obj.Threading();
}
在这里,它的输出是“在 FD 类中”。
这里我们将 FR 类继承到 FD 类中,因此 FR 类的所有属性都是从基础类继承而来的,
但是当我们使用 FD 对象调用函数时,它会调用基于类,但对于线程类,函数是虚拟的,并且 Fun 定义也可用,因此
为什么它没有对 based 类函数进行分类。Threading()
Fun()
Fun()
我希望当我们调用该函数时,它应该被称为 FR 类函数而不是 FD 类。Threading()
Fun()
Fun()
实际输出 : “In FD Class”
预期输出 : “In FR Class”
答:
这被称为虚拟调度,基本上只是意味着更多。要调用的方法由对象的动态类型确定。virtual
你可以把这个调用看作是有一个:this->
class FR
{
public :
virtual int fun()
{
cout<<"In FR Class "<<endl;
}
int Threading()
{
this->fun();
}
};
当对类型的对象进行调用时,在上面的代码中是 但是指向的对象的动态类型是 。因此,当调用虚拟时,它会调用 .Threading
FD
this
FR*
this
FD
fun()
FD::fun()
如果不希望进行虚拟调度,请删除 .然后,您的代码将打印“In FR Class”。fun
virtual
当您将方法声明为虚拟方法时,将为该类生成一个 vtable(如果它是具体的,即没有纯虚拟成员),其中包含指向该类中每个虚拟函数的指针。还将为使用虚拟方法派生自类的每个类生成一个 vtable(只要它们也是具体的)。
然后,该类的每个对象都会获得一个指向其特定 vtable 的 vtable 指针。您的类具有指向包含 的 vtable 的指针,而您的类具有指向包含 的 vtable 的指针。FR
FR::fun
FD
FD::fun
由于是非虚拟的,因此当在类的对象上调用时,使用指向该对象的指针调用实现的方法。然后,当调用时,它会在 的 vtable 中查找函数并调用 .Threading
Threading
FD
FR
this
FD
Threading
this->fun
FD
FD::fun
评论
this
FR::Threading
FR*
fun
FR
FD
通过虚拟函数指针表调用虚拟函数。
派生类 FD 在其纠缠的虚函数指针中用它自己的覆盖函数的地址覆盖虚函数 fun 的地址。
因此,在此调用序列中
obj.Threading();
和
int Threading()
{
fun();
}
为了调用函数 fun,在类 FD 的虚拟函数指针表中搜索指向函数 fun 的指针,并相应地使用 FD 类中提供的函数定义。 然后是 o
评论
obj
因此调用方法调用,这就是虚拟的全部内容FD
fun
FD::fun
virtual