草庐IT

c++ - 什么是 C++ 中的 vtable

这个问题在这里已经有了答案:关闭12年前.PossibleDuplicate:whydoIneedvirtualtable?什么是C++中的vtable?到目前为止,我知道vtable是一个虚拟表,其中包含指向虚拟函数的指针数组。有没有我可以阅读的带有实际实现示例的文章?(任何演练将不胜感激。) 最佳答案 V表(或虚拟表)是大多数C++实现实现多态性的方式。对于一个类的每个具体实现,都有一个指向所有虚方法的函数指针表。指向该表(称为虚拟表)的指针作为数据成员存在于所有对象中。当调用虚方法时,我们会查找对象的v-table并调用相应的

c++ - 什么是 C++ 中的 vtable

这个问题在这里已经有了答案:关闭12年前.PossibleDuplicate:whydoIneedvirtualtable?什么是C++中的vtable?到目前为止,我知道vtable是一个虚拟表,其中包含指向虚拟函数的指针数组。有没有我可以阅读的带有实际实现示例的文章?(任何演练将不胜感激。) 最佳答案 V表(或虚拟表)是大多数C++实现实现多态性的方式。对于一个类的每个具体实现,都有一个指向所有虚方法的函数指针表。指向该表(称为虚拟表)的指针作为数据成员存在于所有对象中。当调用虚方法时,我们会查找对象的v-table并调用相应的

c++ - 从析构函数中抛出异常对于 vtable 是否安全?

请考虑以下示例:#includeclassA{public:virtual~A(){}virtualvoidfoo()=0;};classB:publicA{public:virtual~B(){throw5;}virtualvoidfoo(){}};intmain(int,char*[]){A*b=newB();try{deleteb;}catch(...){raise(SIGTRAP);}return0;}我一直认为(天真)当程序进入这种情况时,进入catch部分,然后对象B在其中b点将是完整的,因为异常将具有“取消”(如果安全地编程)析构函数的效果是非常合乎逻辑的。但是当我尝试在

c++ - 从析构函数中抛出异常对于 vtable 是否安全?

请考虑以下示例:#includeclassA{public:virtual~A(){}virtualvoidfoo()=0;};classB:publicA{public:virtual~B(){throw5;}virtualvoidfoo(){}};intmain(int,char*[]){A*b=newB();try{deleteb;}catch(...){raise(SIGTRAP);}return0;}我一直认为(天真)当程序进入这种情况时,进入catch部分,然后对象B在其中b点将是完整的,因为异常将具有“取消”(如果安全地编程)析构函数的效果是非常合乎逻辑的。但是当我尝试在

c++ - 虚函数的 Vtable 是如何工作的

我对VirtualTable有一个小疑问,每当编译器遇到类中的虚函数时,它都会创建Vtable并将虚函数地址放在那里。对于继承的其他类,情况类似。它是否在每个指向每个Vtable的类中创建一个新指针?如果不是,当创建派生类的新实例并将其分配给BasePTR时,它如何访问虚函数? 最佳答案 每次你创建一个包含虚函数的类,或者你从包含虚函数的类派生,编译器为该类创建一个唯一的VTABLE。如果你不要覆盖在基类中声明为虚拟的函数,编译器使用基类版本的地址派生类。然后它将VPTR放入类(class)。使用简单时,每个对象只有一个VPTR继承

c++ - 如何在 Visual C++ 中检查 vtable?

假设一个人继承了一个复杂的代码库(在VisualC++中,假设是2003年或更晚),具有一个庞大而复杂的继承图。假设它很深,并且有很多虚函数,甚至可能还有多重继承。(是的,有点维护噩梦)。任何将此类层次结构重构为更合理的东西的尝试都需要知道每个类使用的每个虚函数的实现。如果我们采用任意叶类L1-它派生自基类B1,派生自基类B2,等等-它显然会有一个类的vtable,它将显示类似(伪vtable)的内容:L1::F1B3::F2B1::F3L1::F4etc....具体取决于哪些虚函数已被哪个类覆盖。一个人怎么能看到这样一个形式如此之多的虚表呢?可以通过通读代码来手动重建它,但这很容易出

c++ - 在这个例子中将创建多少个 vtable 和 vpointer?

关闭。这个问题是notreproducibleorwascausedbytypos.它目前不接受答案。这个问题是由于错别字或无法再重现的问题引起的。虽然类似的问题可能是on-topic在这里,这个问题的解决方式不太可能帮助future的读者。关闭8年前。Improvethisquestion这是vtables上的程序。我对vtables和v-pointers的理解是否正确。ClassB{public:virtualVoidHello(){cout在我看来,将有两个vtables而只有一个vptr。我的看法正确吗?

c++ - 同名类之间的共享 vtables : call to virtual method crashes when casting to base type

检查下面的更新,我可以重现并需要帮助。我有一个奇怪的崩溃,其中一些方法在除1个地方之外的任何地方都可以正常工作。这是代码:structbase{virtualwchar_t*get()=0;//canbe{returnNULL;}doesn'tmatter};structderived:publicbase{virtualwchar_t*get(){returnSomeData();}};structcontainer{deriveddata;};//thisisapprox.howitisusedinrealprogramvoidoutput(constbase&data){data

c++ - 是否可以跨 RTLD_LOCAL 加载的库合并 vtables/typeinfo 等弱符号?

对于上下文:我有一个Java项目,它部分使用两个JNI库实现。例如,libbar.so依赖于libfoo.so。如果这些是系统库,System.loadLibrary("bar");会成功的。但是因为它们是我用我的JAR运送的自定义库,所以我必须做类似的事情System.load("/path/to/libfoo.so");System.load("/path/to/libbar.so");libfoo需要先走,否则libbar找不到它,因为它不在系统库搜索路径中。这已经运行了一段时间,但我现在遇到了一个问题,尽管类型是正确的。我追踪到这两个库对该类型的类型信息有不同的定义,并且它们没

c++ - 如何在 C++ 程序中查看 gdb 中的 vtable?

我的一个C++程序中有一个有趣的问题。显然,我的一个类的vtable在程序执行期间被/变得困惑了。在gdbsession中,我发现如果我直接调用对象的方法它会成功,但如果我使用指针或引用,我最终会进入一个完全不相关的类的析构函数,该类不会很快被实例化。没有this-指针当然会改变。假设我的观察是正确的,我如何在gdb中查看对象的vtable?我在Linux上使用gcc,我的gdb版本是GNUgdb(Ubuntu/Linaro7.3-0ubuntu2)7.3-2011.08。 最佳答案 您可以使用gcc的-fdump-class-hi