jjzjj

c++ - 对 vtable 的 undefined reference - 虚拟成员,由 gsoap 生成的类

gsoap及其工具wsdl2h和soapcpp2为我提供了一个包含以下内容的soapStub.h文件:classSOAP_CMACns2__SOAPKunden{public:std::string*adresszusatz;//...public:virtualintsoap_type()const{return7;}//...ns2__SOAPKunden():adresszusatz(NULL),x(NULL){}//leftoutallmemberinit.virtual~ns2__SOAPKunden(){}};我从一个小应用程序开始,使用该类使用来自informixDB的数

c++ - 在运行时访问 v-table

是否可以在运行时访问函数的v表?是否可以确定不同功能版本的数量等元信息?这可能更像是一个理论问题,但是开发人员是否可以通过确保v表永远不会超过特定行数来限制可以扩展给定基类的类的数量? 最佳答案 Isitpossibletoaccessafunction'sv-tableatruntime?Canmeta-informationsuchasthenumberofdifferentfunctionversionsbedetermined?不是以便携的方式。该标准甚至没有虚拟表的概念,它更多的是一个实现细节而不是一个要求,即使我知道的所

c++ - 何时为多态类初始化 vptr(指向 vtable)?

这与"WhenVTABLEiscreated?"无关.相反,应该在什么时候初始化VPTR?是在构造函数的开头/结尾还是在构造函数之前/之后?A::A():i(0),j(0)-->>here?{-->>here?//...-->>here?} 最佳答案 虚拟调用的机制(通常是一个v表,但不需要)是在ctor-initializer期间、基础子对象构造之后和成员构造之前设置的。[class.base.init]部分法令:Memberfunctions(includingvirtualmemberfunctions,10.3)canbec

c++ - 对派生对象的 C++ 虚函数调用是否通过 vtable?

在下面的代码中,它通过指向派生对象的指针调用虚函数foo。这个调用会通过vtable还是会直接调用B::foo?如果它通过一个vtable,让它直接调用B::foo的C++惯用方法是什么?我知道在这种情况下我总是指向B。ClassA{public:virtualvoidfoo(){}};classB:publicA{public:virtualvoidfoo(){}};intmain(){B*b=newB();b->foo();} 最佳答案 如果您启用了优化,大多数编译器都足够聪明,可以消除这种情况下的间接调用。但只是因为您刚刚创建

c++ - 错误:__cxxabiv1::__si_class_type_info 的 libc++abi.dylib`vtable

我正在为iOS6/7(使用Xcode5和iOSSDK7.0)构建一个使用cocos2d-x的游戏,并开始引入一些利用继承的模式,但我遇到了这个异常。libc++abi.dylib`vtablefor__cxxabiv1::__si_class_type_info:0x284a540:addb%al,(%eax)0x284a542:addb%al,(%eax)0x284a544:jo0x284a4eb;vtablefor__cxxabiv1::__libcxxabi::__void+910x284a546:testb(%edx),%al0x284a548:lesl2(%edx,%eax,

c++ - 为什么显式模板实例化会在存在外线虚拟时导致 weak-template-vtables 警告?

[编辑以显示.cpp和hpp之间的拆分]//file.hppclassBase{public:virtual~Base(void);Base(void);Base(constBase&)=default;};templateclassDerived:publicBase{public:Derived(void);boolfunc(void);};//file.cpp#include"file.hpp"Base::~Base(void){}Base::Base(void){}templateboolDerived::func(void){returntrue;}templateDeriv

c++ - 非多态类型上的 Dynamic_cast

我能理解为什么dynamic_cast在这种情况下有效:#includestructA{virtual~A()=default;};structB{virtual~B()=default;};structC:A,B{};voidf(constA&a){if(autop=dynamic_cast(&a))std::cout但是为什么如果你从B中删除多态性它仍然有效:#includestructA{virtual~A()=default;};structB{};structC:A,B{};voidf(constA&a){if(autop=dynamic_cast(&a))std::cout

c++ - 为什么 COM(组件对象模型)语言无关?

我知道COM提供跨语言和应用程序的二进制级别的可重用性。我读到所有为COM构建的组件都必须遵守标准内存布局才能独立于语言。我不明白“标准内存布局”是什么意思。什么使COM语言独立? 最佳答案 首先,一些技术背景:C++编译器通常会为任何具有虚函数的类生成一个称为“vtable”的东西。这基本上是一个函数指针表。vtable包含指向类实现的每个虚方法的函数指针。在COM中,接口(interface)基本上是组件实现的抽象基类,例如:classCSomeComponent:IUnknown,ISomeOtherInterface{...

c++ - 虚函数和多重继承情况下的对象布局

我最近在接受采访时被问及有关具有虚函数和多重继承的对象布局。我在上下文中解释了它是如何在不涉及多重继承的情况下实现的(即编译器如何生成虚拟表,在每个对象中插入一个指向虚拟表的secret指针等等)。在我看来,我的解释似乎缺少了一些东西。所以这里有问题(见下面的例子)C类对象的确切内存布局是什么。C类的虚拟表条目。A、B和C类对象的大小(由sizeof返回)。(8、8、16??)如果使用虚继承呢?大小和虚拟表条目肯定会受到影响吗?示例代码:classA{public:virtualintfunA();private:inta;};classB{public:virtualintfunB(

c++ - 从 V 表调用虚函数

很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visitthehelpcenter.关闭9年前。因为C++中的所有虚函数都存储在V表中。覆盖发生在虚函数的情况下。请问有什么方法可以直接从表中调用虚函数,也可以确定V表包含哪些函数。