草庐IT

c++ - 从 DLL 实例化子类时,vtable 是否正确?

当您在主可执行文件中有一个基类并在DLL中定义了子类(例如,插件)时,当您想要获得一个插件时会发生什么?我正在寻找一篇文章/答案来阐明当你发生什么时加载动态链接库调用DLL的函数返回一个plugin*(它有虚函数)在您的主要可执行代码中使用该插件删除、卸载我正在考虑vtable和其他C++问题。例如,如果您卸载DLL仍然有一些插件正在运行......“代码”会消失吗? 最佳答案 既然你在谈论插件,你一定在做类似LoadLibrary的事情。假设Windows:加载库。您通常会调用LoadLibrary,然后调用GetProcAddr

c++ - 在 MSVC ABI 中,如何可靠地找到仅给出 (void*) 的 vtable?

这个问题专门针对不可移植的MSVCABI内容。我正在尝试用显然不可移植但不神奇的C++编写与C++的typeid等效的代码。对于ItaniumABI(在Linux/Mac上使用),它非常简单:conststd::type_info&dynamicast_typeid(void*mdo){std::type_info**vptr=*reinterpret_cast(mdo);std::type_info*typeinfo_ptr=vptr[-1];return*typeinfo_ptr;}所以现在我正在查看64位MSVCABI,该死的,我被难住了。对于非常简单的类,即以偏移量0处的vfp

c++ - 在 C++ 中为具有多重继承派生类的 vtables 的基之一调用赋值运算符

好的,这会有点棘手。这是一个(简化的)代码:classA{virtual~A();//fields,noneofwhichhasanassignmentoperatororcopyconstructor};classB{virtual~B();//sameasA};classDerived:publicA,publicB{Derived();Derived(constB&b);//nofields};与Derived::Derived(constB&b)(即接受其中一个基础)如下Derived::Derived(constB&b){*static_cast(this)=b;//Doot

c++ - 了解虚拟继承类 vtables 和 vptr 创建

下面的代码是多重继承的,每个类都有一个成员变量,一个普通函数和一个虚函数。classbasec{intx;public:basec(){x=0;}voidprint(){}virtualvoidxyz(){}};classderivedc:publicvirtualbasec{intdc;public:derivedc(){dc=0;}virtualvoidxyzdc(){}};classderivedd:publicvirtualbasec{intdd;public:derivedd(){dd=0;}virtualvoidxyzdd(){}};classchild:publicder

c++ - 实现虚函数时未定义对 vtable 的引用

这个问题在这里已经有了答案:Undefinedreferencetovtable(21个回答)关闭6年前。我尝试实现JesseLiberty和TimKeogh编写的“C++编程入门”示例,但实现纯虚函数是编译而不是构建。它给出了错误:未定义对“vtableforcircle”的引用我尝试用变量itsRadius替换虚函数GetItsRadius以查看它是否可行,但它开始在switch语句中给我同样的错误,但对于Rectangle和Square以及circle之前的错误。代码如下:#includeusingnamespacestd;enumBOOL{FALSE,TRUE};classSh

c++ - "<vtable for A+16>"是什么意思?

这是我的代码。我只是想看看virtualinherit的内存布局。#includeusingnamespacestd;classA{private:inta;public:virtualvoidprint()const{cout然后在gdb中,我用papb输出是(gdb)pa$1={_vptr.A=0x400b40,a=0}(gdb)pb$2={={_vptr.A=0x400b18,a=4196384},membersofB:_vptr.B=0x400af8,b=0}(gdb)我知道_vptr.A和_vptr.B的含义,但我不明白B+24或A+16的vtable是什么意思。感谢您的回答

c++ - 无论如何要从他们的 vtable 重建一些保存的类?

我正在将一些对象复制到一个文件中,它们都派生自同一个类。但我希望能够在加载它们之后调用它们的函数来执行该类应该执行的操作,这是我到现在为止所做的:#include#includeusingnamespacestd;structa{virtualvoidprint(){coutprint();testifile.read((char*)x,sizeof(b));x->print();}我的示例工作正常,但如果我注释保存部分然后运行程序,则vtable似乎对新运行的应用程序无效(尽管我的代码中没有任何更改)。问题是我的文件管理器类不知道所有可能从我的基础对象派生的对象,我想重建我所有的应用

c++ - C++ vtables中的双重间接

我编写了这个非常简单的C++程序,我想知道为什么编译器将vtable布局为跨越两个指针取消引用。这是C++程序:classFoo{public:virtualvoidbar(){}};intmain(intargc,char*arv[]){Foofoo;Foo*foo_p(&foo);foo_p->bar();}现在,我可以查看编译器生成的程序集:$g++-ggdb-Wall-O0-Stest.cpp以下是相关部分:.loc190leaq-16(%rbp),%rax#puttheaddressof'foo'in%raxmovq%rax,%rdi#useitasthefirstargum

c++ - 使用 C++ 的 OpenGL : vtable troubles when passing class array to glTexImage2d

我用floatr、floatg、floatb、floatalpha创建了一个类Color。它有一个带有虚拟析构函数的基类。我正在尝试将Color数组传递给opengl函数glTexImage2D,其中GL_RGBA组织类型为float(这将是一个数组{floatr,floatg,floatb,floatalpha}).这要求Color仅包含4个float(16字节大小)。但是,sizeof(Color)显示我的类有一个20字节的大小,因为Color的基类有一个vtable,感谢析构函数。如何保留我的vtable并将我的Color数组传递给glTexImage2D?

c++ - C++ ABI 是否指定 vTable 和 RTTI 信息应该如何存在?

像GCC/VC这样的流行实现使用多态对象的第一个size_t空间作为指针,指向一个vtable结构。这是最新的C++ABI的一部分吗?RTTI的实现如何,C++ABI有没有规定如何实现?谢谢 最佳答案 不,C++标准没有指定这些应该如何实现。没有单一的C++ABI。 关于c++-C++ABI是否指定vTable和RTTI信息应该如何存在?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questio