【发布时间】:2010-01-31 08:49:03
【问题描述】:
尊敬的先生!
我应该告诉你我所知道的和我不知道的问题,这样你就可以解决我理解的薄弱环节。
我知道 C++ 通过使用指针数组 Vtable 来实现多态性 每个指针指向类的虚函数,层次结构中的每个类都有一个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的作用是什么,它是如何工作的请详细说明。
【问题讨论】:
-
Zia,请学习 Markdown 语法:stackoverflow.com/editing-help
-
这是不在您的级别上需要了解的全部信息。更多地关注语言以及它是如何工作的,而不是它是如何实现的。这是只有在编写编译器时才需要知道的那种公开信息。最终你会了解基础知识,但就像下面的所有示例一样,大多数人只知道真正的基础知识,而不知道他们真正需要知道的细节。
-
@Martin 有些人需要了解管道才能使用浴室。我知道我知道。此外,即使 C++ 开发人员不编写编译器,了解 virtual 关键字的结果也很重要。
-
@Vincent 如果你打算来我家,请告诉我——我会准备好拖把和水桶。
-
@Martin:最初的提问者不需要知道答案并不意味着更高级的人不能从被问及回答中受益