草庐IT

c - 在 vtbl 中命名函数指针

抱歉,初学者的问题。在非常好的文章中CominplainC我读到这句话:OnerequirementofaCOMobjectisthatthefirstthreemembersofourVTable(i.e.,ourIExampleVtblstruct)mustbecalledQueryInterface,AddRef,andRelease.这是真的吗?如果更改名称,但参数、调用约定和返回值将相同怎么办?你还在做这个吗?如果不是,为什么?非常感谢您的回复。(正面或负面。) 最佳答案 每个COM接口(interface)都必须派生自I

c++ - 更改现有对象 "on the fly"的 VTBL,动态子类化

考虑以下设置。基类:classThing{intf1;intf2;Thing(NO_INIT){}Thing(intn1=0,intn2=0):f1(n1),f2(n2){}virtual~Thing(){}virtualvoiddoAction1(){}virtualconstchar*type_name(){return"Thing";}}和派生类不同仅通过上述方法的实现:classSummator{Summator(NO_INIT):Thing(NO_INIT){}virtualvoiddoAction1()override{f1+=f2;}virtualconstchar*ty

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++ - 编译器如何为虚函数调用生成代码?

CAT*p;...p->speak();...有些书说编译器会将p->speak()翻译成:(*p->vptr[i])(p);//iistheidxofspeakinthevtbl我的问题是:因为在编译时,不可能知道p的真实类型,这意味着不可能知道要使用哪个vptr或vtbl。那么,编译器如何生成正确的代码呢?[修改]例如:voidfoo(CAT*c){c->speak();//ifcpointtoSmallCat//shouldtranslateto(*c->vptr[i])(p);//usevtblat0x1234//ifcpointtoCAT//shouldtranslateto

c++ - 编译器如何为虚函数调用生成代码?

CAT*p;...p->speak();...有些书说编译器会将p->speak()翻译成:(*p->vptr[i])(p);//iistheidxofspeakinthevtbl我的问题是:因为在编译时,不可能知道p的真实类型,这意味着不可能知道要使用哪个vptr或vtbl。那么,编译器如何生成正确的代码呢?[修改]例如:voidfoo(CAT*c){c->speak();//ifcpointtoSmallCat//shouldtranslateto(*c->vptr[i])(p);//usevtblat0x1234//ifcpointtoCAT//shouldtranslateto

c++ - 如何在不破坏 vtbl 的情况下执行与 memset(this, ...) 等效的操作?

我知道memset不适合用于class初始化。例如,类似于以下内容:classX{public:X(){memset(this,0,sizeof(*this));}...};如果混合中有virtual函数,将会破坏vtbl。我正在处理一个(巨大的)遗留代码库,它是C-ish但用C++编译,因此所有有问题的成员通常都是POD,不需要传统的C++构造函数。C++的使用逐渐深入(如虚函数),这让没有意识到memset具有这些额外的C++dentry的开发人员感到痛苦。我想知道是否有一种C++安全的方法来执行初始的全能零初始化,然后可以在不适合零初始化的情况下进行特定的按成员初始化?我找到了类

c++ - 如何断言特定类在其布局中没有任何 vtbl 指针?

我有一个简单的RAII类来确保正确处理一些句柄。现在我想断言,没有人会意外地向它添加任何虚拟方法。在我看来,我需要断言该类没有vtbl指针。我该怎么做?是否可以在编译时断言?编辑我将满足于桌面编译器。据我所知,没有不使用vtbl实现多态性的桌面c++编译器。 最佳答案 如果你有C++11库,你可以使用std::is_polymorphic:IfTisapolymorphicclass(thatis,aclassthatdeclaresorinheritsatleastonevirtualfunction),providestheme