草庐IT

c++ - 获取没有对象的类的vtable

我正在尝试实现类似于thefirstdescribedhere的系统.也就是说,(ab)使用vtable修改来在运行时更改对象行为。这是我在我正在处理的C++项目中创建高效类型通用包装器的尝试的一部分。如果您无法访问该示例,则使用memcpy()和this指针复制vtable:voidsetType(constDataType&newType){memcpy(this,&newType,sizeof(DataType));}但是,我对这种方法有一个问题:我没有目标类的对象来从中复制vtable,并且不想创建一个,因为某些类型的构造成本很高。有没有办法在没有该类对象的情况下访问将被放置到

c++ - 防止派生析构函数中的 vtable 数据竞争

假设我有以下代码#include#include#includestructFooBase{voidstart(){run_condition_=true;t_=std::thread([this](){thread_handler();});}virtual~FooBase(){run_condition_=false;if(t_.joinable())t_.join();}protected:virtualvoidthread_handler()=0;std::atomic_boolrun_condition_{false};private:std::threadt_;};stru

C++:是一个具有虚拟基础但没有虚拟函数的多态类并且具有VTable吗?

考虑以下代码:#include#include#includeusingnamespacestd;structA{intdata;};structB1:A{};structB2:virtualA{};structBase1:virtualA{};structBase2:virtualA{};structDerived:Base1,Base2{};intmain(){cout::value::value::value在我的系统上打印4812000这意味着这些类都不是多态的。但是,B1和B2的大小因指针的确切大小而异,该指针可能是指向vtable的指针。我用-fdump-class-hie

c++ - C++ vtable 方法是如何排序的 *在实践中*

理论上,C++没有二进制接口(interface),vtable中方法的顺序是未定义的。更改有关类定义的任何内容,您需要在每个dll等中重新编译依赖于它的每个类。但我想知道编译器在实践中是如何工作的。我希望他们只使用方法在header/类中定义的顺序,这样可以安全地附加其他方法。但他们也可以使用杂乱名称的哈希值来使它们独立于顺序,但也完全不可升级。如果人们对特定编译器的特定版本如何在不同操作系统等中工作有具体的了解,那将是最有帮助的。补充:理想情况下,将为虚拟方法偏移量创建链接器符号,这样偏移量就永远不会被硬编译到调用函数中。但我的理解是,那永远不会完成。正确吗?

c++ - 获取虚拟成员函数的真实地址(或 vTable 中的索引)

在c++中有什么方法可以获取成员函数的真实地址,或者vTable中的索引?更新:我不知道vTable中的INDEX并且我不知道地址这就是我想知道的原因:我想挂接DirectX的函数ID3DXFont->DrawText。如果我知道vTable中DrawText的索引,我可以替换它来做钩子(Hook)。但是如何获取索引呢?如果它能够获取真实地址,我可以在vTable中搜索它以获取索引。而且不是特别是ID3DXFont->DrawText,也许将来会有一些其他功能,所以我正在尝试编写一个通用的钩子(Hook)函数。这是我到目前为止尝试过的:#includeusingnamespacestd

c++ - 如何使用 vtable 确定类类型

我最近参加了一个职位的面试,其中C/C++是主要语言,在一个问题中,我被告知可以使用vtable来确定基指针实际存储在层次结构中的哪个类。所以,例如,如果你有classA{public:A(){}virtual~A(){}virtualvoidmethod1(){}};classB:publicA{public:B(){}virtual~B(){}virtualvoidmethod1(){}};然后你实例化A*pFoo=newB(),是否真的可以使用虚函数表来确定pFoo是否包含指向A或B实例的指针? 最佳答案 这显然是依赖于实现的

c++ - 在什么情况下 vtable 指针可以为空(或 0x1)?

我目前正在调试崩溃日志。发生崩溃是因为(c++-)对象的vtable指针是0x1,而据我从崩溃日志中可以看出,对象的其余部分似乎没问题。程序在尝试调用虚拟方法时崩溃。我的问题:在什么情况下vtable指针可以变为null?operatordelete是否将vtable指针设置为空?这发生在使用gcc4.0.1(AppleInc.build5493)的OSX上。 最佳答案 可能是内存践踏-错误地覆盖了vtable。在C++中有几乎无限多的方法可以“实现”这一点。例如,缓冲区溢出。 关于c+

c++ - vtable:底层算法

我对vtables的理解是,如果我有一个带有虚函数speak()的类Cat,它有子类Lion和HouseCat,则有一个vtable将speak()映射到每个子类的正确实现。于是打个电话cat.speak()编译为cat.vtable[0]()即在vtable位置0进行一次查找,并调用该位置的函数指针。我的问题是:多重继承会怎样?让我们添加一个类Pet。Pet有虚函数speak()和eat()。HouseCat扩展了Pet,而Lion没有。现在,我需要确保pet.eat()编译为pet.vtable[1]()即vtable[0]需要speak()。Pet.eat需要位于slot1。那是

c++ - 如何使用 G++ 抑制纯虚拟类的 C++ vtable 生成?

可以在MSVC中使用__declspec(novtable)属性来抑制C++vtable生成。但是,似乎thereisnoequivalentattribute用于GNUC++编译器。事实上,为纯虚拟类保留vtables会不必要地链接__cxa_abort()和许多其他链接,我想避免这种情况发生,因为我正在为嵌入式系统编程。那么,我该怎么办?structISomeInterface{virtualvoidFunc()=0;};classCSomeClass:publicISomeInterface{virtualvoidFunc();}voidCSomeClass::Func(){//

c++ - 缺少 vtable 通常意味着第一个非内联虚拟成员函数没有定义

我很确定这个问题是重复的,但我的代码在这里不同,以下是我的代码。它因“undefinedsymbol”错误而失败,不确定缺少什么。classParent{public:virtualintfunc()=0;virtual~Parent();};classChild:publicParent{public:intdata;Child(intk){data=k;}intfunc(){//virtualfunctioncout以下是编译时的O/PUndefinedsymbolsforarchitecturex86_64:"Parent::~Parent()",referencedfrom:C