草庐IT

cxa_pure_virtual

全部标签

c++ - "non-virtual thunk to <method name>", 引用自 : Vtable for <classname>in <objectfile. o>

在Debug模式下编译时,我的xcode编译出现以下链接错误:"",referencedfrom:Vtableforin"non-virtualthunkto",referencedfrom:Vtableforin奇怪的是:它只出现在我的一个构建目标中(该代码的两个目标几乎相同),而且如果这些方法是在头文件而不是.cpp中定义的,那么它对两者都适用目标。所有这些方法都是纯虚拟的。发生这些错误的类继承自多个类,但只有其中一个会导致这些错误。有人知道导致此错误的原因吗? 最佳答案 遇到了同样的问题。当我们定义了一个虚拟成员函数(在.h头

c++ - virtual对类模板成员使用的影响

我(模糊地)知道如果一个模板没有使用,它就不会被实例化。例如,即使在T=int时T::type没有意义,以下代码也能正常编译。templatestructA{voidf(){usingtype=typenameT::type;}};Aa;//ok它编译是因为f()没有被使用,所以它没有被实例化——因此T::type的有效性仍然没有被检查.其他一些member函数g()是否调用f()都没关系。templatestructA{voidf(){usingtype=typenameT::type;}voidg(){f();}//Isf()stillunused?};Aa;//ok这也是comp

c++ - "pure virtual function called"在 gcc 4.4 上,但不在新版本或 clang 3.4 上

我有一个MCVE,它在使用g++4.4.7版编译时在我的一些机器上崩溃,但可以在clang++3.4.2版和g++6.3版中使用。我想知道它是来自未定义的行为还是来自这个古老版本的gcc的实际错误。代码#includeclassBaseType{public:BaseType():_present(false){}virtual~BaseType(){}virtualvoidclear(){}virtualvoidsetString(constchar*value,constchar*fieldName){_present=(*value!='\0');}protected:virtu

c++ - 为什么 "virtuality"方法在 C++ 中隐式传播?

移除阻止方法虚拟性传播的能力的原因是什么?让我更清楚一点:在C++中,无论你在派生类中编写“virtualvoidfoo()”还是“voidfoo()”,只要在基类中声明foo,它就会是虚拟的。这意味着通过派生*指针调用foo()将导致虚拟表查找(如果派生2函数覆盖foo),即使程序员不希望这种行为。让我举一个例子(对我来说看起来很明显),说明阻止虚拟传播有什么用处:templateclassIterator//Hereisaniteratorinterfaceusefulfordefiningiterators{//whenimplementationdetailsneedtobeh

c++ - 多重(菱形)继承在没有 "virtual"的情况下编译,但没有

给定以下代码(没有虚拟继承):classA{public:virtualvoidf()=0;};classB:publicA{public:virtualvoidf(){}};classC:publicA{public:virtualvoidf(){}};classD:publicB,publicC{/*somecode*/};intmain(){Dd;return0;}代码编译。另一方面,这里:classA{public:virtualvoidf()=0;};classB:virtualpublicA{virtualvoidf(){}};classC:virtualpublicA{v

c++ - 重写方法时,virtual 关键字是什么意思?

virtual关键字在重写方法时有什么作用?我没有使用它,一切正常。每个编译器在这方面的行为是否相同?我应该使用它还是不使用它? 最佳答案 没有它,您无法覆盖成员函数。你只能隐藏一个。structBase{voidfoo(){}};structDerived:Base{voidfoo(){}};Derived::foo确实not覆盖Base::foo;它只是隐藏它,因为它具有相同的名称,如下所示:Derivedd;d.foo();调用Derived::foo.virtual启用多态性,以便您实际上覆盖函数:structBase{vi

c++ - const virtual 和 virtual const 有什么区别?

我看到C++中的某些函数被声明为virtualconstintgetNumber();但是如果函数声明如下有什么区别呢?constvirtualintgetNumber();这两者有什么区别? 最佳答案 如前所述,没有区别。但是,请注意这两个确实不同:virtualconstintgetNumber();virtualintgetNumber()const;第一种方法中,const指的是int类型的返回值。在第二种方法中,const指的是调用该方法的对象;也就是说,this将在此方法中具有类型Tconst*,-您将只能调用const

c++ - 为什么 C++ 向后兼容 C ?为什么没有一些 "pure"C++ 语言?

C和C++是不同的语言,我们都知道这一点。但是如果这些语言不同,为什么仍然可以使用malloc或free之类的功能?我敢肯定C++有各种各样的尘土飞扬的东西,因为C,但既然C++是另一种语言,为什么不删除这些东西,让它不那么臃肿,更干净和清晰呢?是因为它允许程序员在没有OO模型的情况下工作,还是因为某些编译器不支持C++的高级抽象特性? 最佳答案 因为如果C++不能像现在这样与C兼容,它就会彻底死去。如果C++与C不兼容,除了fanbois,没有人会喜欢C++。(我知道我可能会因此而被否决。就这样吧!)。

c++ - SWIG 包装库中 __cxa_allocate_exception 期间的段错误

在为Ruby开发一个SWIG封装的C++库时,我们在C++代码内的异常处理过程中遇到了无法解释的崩溃。我不确定重新创建问题的具体情况,但它首先发生在调用std::uncaught_exception期间,然后在一些代码更改后,移至__cxa_allocate_exception在异常构造期间。GDB和valgrind都没有提供任何有关崩溃原因的见解。我找到了几个类似问题的引用资料,包括:http://wiki.fifengine.de/Segfault_in_cxa_allocate_exceptionhttp://forums.fifengine.de/index.php?topic

c++ - 为什么 `explicit` 与 `virtual` 不兼容?

structA{//errorC2216:'explicit'cannotbeusedwith'virtual'virtualexplicitoperatorbool()const{returntrue;}};structB:A{//errorC2216:'explicit'cannotbeusedwith'override'explicitoperatorbool()constoverride{returnfalse;}};intmain(){if(A()){}if(B()){}}我的编译器是VC++2013RC。为什么explicit与virtual不兼容?原因是什么?