尊敬的先生!
我应该告诉你关于所提出的问题我知道什么和不知道什么,以便你可以解决我理解的薄弱环节。
我知道c++通过使用Vtable(指针数组)来实现多态性
每个指针都指向类的虚函数,层次结构中的每个类都有一个虚函数表。现在假设我有以下课程
class person
{
char name[20];
public:
person(char* pname)
{
strcpy(name,pname);
}
virtual void show()
{
cout<<"inside person show method, Name: "<<name;
}
};
class teacher:public person
{
int scale;
teacher(char*pname, int s):person(pname)
{
scale=s;
}
void show()
{
cout<<"inside the teacher show method, Scale: "<<scale;
}
};
现在假设我在主程序中写入
person *ptr;
ptr=new teacher(16,"Zia");
ptr->show();
现在我很困惑,调用将转到基类的 show 函数,现在因为它是一个虚函数,所以它反过来调用适当的函数。我知道我错了。我很困惑调用的顺序是什么。 Vtable的作用是什么以及它是如何工作的请详细说明。
Since show
被宣布virtual
in the person
类中,编译器不会像非虚拟方法那样对方法调用进行硬编码,而是会在 V 表中编译查找以检索正确的函数。
So ptr->show()
将被编译为ptr->vtable['show']()
这意味着“搜索与方法对应的函数指针show
并执行它”。
由于在运行时,ptr
指向类的对象teacher
,虚函数表槽show
包含一个指向该方法的指针show
在课堂里teacher
。这就是执行正确方法的原因。
实际上,V 表中的查找不是使用字符串完成的,而是使用数字方法标识符来完成,以便尽可能快。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)