gpt4 book ai didi

c++ - C++如何在内部实现多态性?

转载 作者:可可西里 更新时间:2023-11-01 18:04:15 25 4
gpt4 key购买 nike

尊敬的先生!

我应该告诉你我所知道的和我不知道的问题,这样你就可以解决我理解的薄弱环节。

我知道c++通过使用指针数组的Vtable来实现多态性每个指针指向类的虚函数,层次结构中的每个类都有一个vtable。现在假设我有以下类(class)

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();

现在我在这一点上感到困惑,调用将转到基类的显示函数,现在因为它是一个虚函数所以它反过来调用适当的函数。我知道我在这里错了。我很困惑电话的顺序是什么。请详细说明Vtable的作用和工作原理。

最佳答案

由于 showperson 类中被声明为 virtual,编译器不会像对 a 那样对方法调用进行硬编码非虚拟方法,它将改为在 V 表中编译查找以检索正确的函数。

所以ptr->show()会被编译为ptr->vtable['show'](),意思是“搜索方法对应的函数指针” 显示并执行它。

由于在运行时,ptr 指向类 teacher 的对象,show 的 vtable 槽包含指向方法 的指针>show 在类 teacher 中。这就是执行正确方法的原因。

实际上,在 V 表中的查找不是使用字符串而是使用数字方法标识符来完成的,以便尽可能快。

关于c++ - C++如何在内部实现多态性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2171081/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com