Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
虚拟方法调用在C++;? < > >强>虚方法调用< /> >通过虚表在C++中工作?_C++_Oop_Inheritance_Virtual - Fatal编程技术网

虚拟方法调用在C++;? < > >强>虚方法调用< /> >通过虚表在C++中工作?

虚拟方法调用在C++;? < > >强>虚方法调用< /> >通过虚表在C++中工作?,c++,oop,inheritance,virtual,C++,Oop,Inheritance,Virtual,阅读本文 我可以在这里解释,但是wikipedia比我做得更好。每个至少有一个虚拟方法的类都有它的虚拟表-指向该类方法的函数的指针表 在COM.< P>中广泛使用。C++标准没有指定如何实现虚拟函数机制。 我认为所有当前C++编译器都使用虚拟表。 对于包含至少一个虚拟函数的类来说,通常的方法是使用一个指向所谓虚拟表的隐藏指针,其中特定类的虚拟函数的地址按编译器特定的顺序输入。 然后,每个构造函数将这个隐藏指针设置为它所属类的虚拟表 使用VTables和函数指针。虚拟函数的函数指针将列在VTabl

阅读本文


我可以在这里解释,但是wikipedia比我做得更好。

每个至少有一个虚拟方法的类都有它的虚拟表-指向该类方法的函数的指针表


在COM.

< P>中广泛使用。C++标准没有指定如何实现虚拟函数机制。

我认为所有当前C++编译器都使用虚拟表。 对于包含至少一个虚拟函数的类来说,通常的方法是使用一个指向所谓虚拟表的隐藏指针,其中特定类的虚拟函数的地址按编译器特定的顺序输入。


然后,每个构造函数将这个隐藏指针设置为它所属类的虚拟表

使用VTables和函数指针。虚拟函数的函数指针将列在VTable中

MFC使用消息映射而不是虚拟函数,这减少了大小限制。如果我们使用多个虚拟函数,VTable最终会变得很大

嗯??你是说调用虚拟方法?这和打普通电话一样。让你的问题更具体。在C++调用中,就像调用一个普通的方法<代码>对象.FoE()一样;让我猜猜。你问的是实现?虚拟方法的实现是未定义的,所以这个问题毫无意义。作为旁注,在没有经验的情况下断章取义地知道答案对你没有任何帮助(除非你想构建一个编译器,这样你就不会问这个问题了)。每个类都没有虚拟表。首先,只有多态类才有vtable,第二个vtable是特定于实现的。标准只是说“你应该工作”,但没有说如何工作,vtables就是如何工作。读完这一页后,我觉得这对初学者来说太可怕了。它没有包含足够有用的信息,但却非常危险。关于效率的章节是完全误导的,它链接到的是1996(这是超过十年的历史,从GCC 2.96的时间(甚至没有被认为是一个工作的C++编译器,更不用说现代的C++编译器))。替代方案的章节对于虚拟调度的相对讨论是有益的,但它绝对不适用于C++(这对初学者来说并不明显)。实际上,过去2年中,虚拟表是最简单的方法,但是其他一些已经被尝试和报告为更有效(在执行时间和二进制大小上)。例如,请看:它不是很详细,但结尾有一些很酷的图表,表明虚拟表是比较起来效率最低的方法。同意VT是最简单的方法(使用最广泛的原因之一)。但是那些图表(哇),线条是平坦的,那里有一些古怪的东西。此外,“小程序由脚本生成”一行也有点突出。我希望看到现实世界中的程序以所有三种语言实现。不同类型的程序也会有不同的特点。@Matthieu:哇,我又学到了新东西!谢谢,我相应地修改了我的答案。“我希望现在一切都好了?”马丁:我当然也希望在工作中看到这一点。然而,考虑其他选择是件好事。我认为
vtable
方法遇到的主要问题是多重继承,我希望在更常见的简单继承情况下看到这样的图,其中
vtable
方法看起来非常理想。@Matthieu:是的,我想我们可以同意这都是很好的工作。我们只需要更多的信息。