jjzjj

c++ - 反汇编多重继承中的虚拟方法。 vtable 是如何工作的?

假设以下C++源文件:#includeclassBaseTest{public:inta;BaseTest():a(2){}virtualintgB(){returna;};};classSubTest:publicBaseTest{public:intb;SubTest():b(4){}};classTriTest:publicBaseTest{public:intc;TriTest():c(42){}};classEvilTest:publicSubTest,publicTriTest{public:virtualintgB(){returnb;}};intmain(){EvilT

c++ - C++ 中 (base->*&Func)() 的含义是什么

下面是简单的类定义classBase{public:virtualvoidFunc(){cout和声明(b->*&Base::Func)();调用Func的派生版本,与b->Base::Func()不同,它按预期调用基础版本,为什么会发生这种情况,调用的确切含义是什么? 最佳答案 调用的意思是增加冗长。基本上:表达式&Base::Func是指向成员函数的指针,并且(b->*x)()是调用成员函数的语法x指向b指向的对象。在这个情况下,因为x是一个常量,所以它与写作大致相同*&变量。与b->Func()含义相同。至于为什么它的行为不同

c++ - 为什么头文件中定义的 C++ 虚函数可能无法在 vtable 中编译和链接?

情况如下。我有共享库,其中包含类定义-QueueClass:IClassInterface{virtualvoidLOL(){dosomemagic}}我的共享库初始化类成员QueueClass*globalMember=newQueueClass();我的共享库导出C函数,它返回指向globalMember的指针-void*getGlobalMember(void){returnglobalMember;}我的应用程序像这样使用globalMember((IClassInterface*)getGlobalMember())->LOL();现在非常棒的东西-如果我不从共享库引用LOL

c++ - 类的对象(使用单/多继承)有多少个 vptr?

一个对象通常需要多少个vptr,其clas(child)具有单一继承,基类多重继承base1和base2。识别一个对象有多少个vptr的策略是什么,它具有一对单继承和多继承。虽然标准没有具体说明vptrs但我只想知道一个实现是如何实现虚函数的。 最佳答案 你为什么关心?简单的答案是足够,但我猜你想要更完整的东西。这不是标准的一部分,所以任何实现都可以随心所欲,但一般的经验法则是,在使用虚拟表指针的实现中,作为第零近似值,用于您需要的动态调度至多指向虚拟表的指针与向层次结构中添加新虚拟方法的类一样多。(在某些情况下,可以扩展虚拟表,基

C++——与对象或类相关联的 vptr 和 vtable?

vptr--虚表指针vtbl——虚拟表问题1>vptr与类的对象相关联是否正确?问题2>vtbl与类关联是否正确?问题3>它们如何真正协同工作?谢谢 最佳答案 请注意vptr和vtbl是实现定义的C++标准甚至没有谈论它们。然而,大多数已知的编译器通过vptr和vtbl实现动态调度。问题一:vptr与类的对象相关联是否正确?是vptr与包含Atleastone虚拟成员函数的类的对象相关联。编译器将Vptr添加到多态类的每个对象(包含至少一个虚成员函数)this指针的前4个字节然后指向vptr问题2:vtbl与类关联是否正确?是Vtb

C++ - 对`vtable 的 undefined reference

我想知道为什么会出现此错误:对“BaseRenderer的vtable”的undefinedreference我尝试四处搜索,但似乎无法弄清楚。我试过摆脱虚函数,删除构造函数等。我的BaseRenderer.hclassBaseRenderer:publicRenderer{Q_OBJECTpublic:BaseRenderer();BaseRenderer(QWidget*parent);voidpaintGL();virtual~BaseRenderer();publicslots:voidloadDialog();signals:protected:MeshloadMesh(st

c++ - 如何用虚函数确定类的大小?

这是一道作业题。对于以下代码,#includeusingnamespacestd;classA{public:virtualvoidf(){}};classB{public:virtualvoidf2(){}};classC:publicA,publicB{public:virtualvoidf3(){}};classD:publicC{public:virtualvoidf4(){}};intmain(){cout输出为:8谁能解释一下它是8个字节吗?如果vtable的实现依赖于编译器,那么面试这类问题应该怎么回答呢?虚基类呢?编辑:我在32位平台上工作。

c++ - 是否所有类都有编译器为它们创建的 Vtable?

网上有很多关于虚表的资源。他们通常对他们有相同的陈述:"只要类本身包含虚函数或重写父类的虚函数,编译器就会为该类构建一个vtable。这意味着并非所有类都有编译器为它们创建的vtable。vtable包含指向该类中虚函数的函数指针。每个类只能有一个vtable,同一类的所有对象将共享同一个vtable。"那么,为什么这意味着并非所有类都有编译器为它们创建的虚表呢?是不是因为somc类没有虚函数? 最佳答案 没错。有些类没有虚表,因为它们没有任何虚方法。虚方法是您的编译器无法为其生成直接调用的方法,因为它因类的实现而异。Vtable是

c++ - 对 `typeinfo for class' 的 undefined reference 和对 `vtable for class' 的 undefined reference

这个问题在这里已经有了答案:Undefinedsymbols"vtablefor..."and"typeinfofor..."?(5个答案)关闭9年前。我正在处理C++中的继承。我想写一个程序来对两个数组进行加法和减法。这是我的代码:#include#include#includeusingnamespacestd;classroot{protected:intsize;double*array;public:virtual~root(){}virtualroot*add(constroot&)=0;virtualroot*sub(constroot&)=0;virtualistrea

c++ - 虚拟表和 _vptr 存储方案

有人能解释一下这个不同类的虚拟表是如何存储在内存中的吗?当我们使用指针调用函数时,它们如何使用地址位置调用函数?我们可以使用类指针获得这些虚拟表内存分配大小吗?我想看看一个类的虚拟表使用了多少内存块。我怎么能看到呢?classBase{public:FunctionPointer*__vptr;virtualvoidfunction1(){};virtualvoidfunction2(){};};classD1:publicBase{public:virtualvoidfunction1(){};};classD2:publicBase{public:virtualvoidfuncti