草庐IT

virtual-inheritance

全部标签

c++ - 取消 pthread_cond_wait() 挂起与 PRIO_INHERIT 互斥锁

2012年4月10日更新:Fixedbylibcpatch我在pthread_cond_wait中取消线程时遇到问题,将互斥锁与PTHREAD_PRIO_INHERIT一起使用属性集。不过,这只发生在某些平台上。以下最小示例演示了这一点:(使用g++.cpp-lpthread编译)#include#includepthread_mutex_tmutex;pthread_cond_tcond;voidclean(void*arg){std::cout每次我运行它,main()卡在pthread_join().gdb回溯显示如下:Thread2(Thread0xb7d15b70(LWP25

c++ - 什么是多重虚拟继承?

classfoo:publicvirtualbar,publicvirtualkung{//implementationofthemethodoftheaboveinheritedclass};bar和kung类是一个抽象类,包含在foo类中实现的纯虚方法。这个有什么用? 最佳答案 在你的情况下,如果bar和kung是最派生的基类,只要bar和kung中没有方法冲突,你就会知道它,即编译器在模糊定义中的错误。有关此内容的更多信息,请访问c++常见问题解答:http://www.parashift.com/c++-faq-lite/m

c++ - 构造虚拟基类时的编译器行为

考虑这段代码:#includeclassA{public:A(ints){std::coutA类是B1和B2的虚基类。类C1和C2是相同的,除了C1使用{...}而C2使用(...)来构造B1和B2。由于这里使用了虚继承,类A应该作为C1或C2构造的一部分构造。如果我使用MicrosoftVS2015编译此代码,它会在运行时产生此输出:Createc1:A(5)B1(1,2)B2(3,4)Createc2:A(5)B1(1,2)B2(3,4)这正是我所期望的。但是如果我用GCC(6.1.0)编译它,它会产生这个输出:Createc1:A(5)A(1)B1(1,2)A(3)B2(3,4)

c++ - 如何在没有确切类型信息的情况下从 void* 转换为虚拟基类?

这个问题在这里已经有了答案:Conversionfromvoid*tothepointerofthebaseclass(4个答案)关闭5年前。classA:publicX;classB:publicvirtualA;classC:publicvirtualA;classD1:publicB,publicC;classD2:publicB,publicC;void*p1=newD1;//afterstoringthepointers,void*p2=newD2;//therewillbenoexacttypeinfo.A*pA1=(A*)p1;//Cast1A*pA2=(A*)p2;X*

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++ - 海湾合作委员会 : C++11 inline object initialization (using "this") does not work when there is a virtual inheritance in hierarchy

当在初始化中使用此指针并且在层次结构中存在虚拟继承时,C++11内联对象初始化不起作用(在GCC中)。这可能是GCC的错误吗(因为它在CLang中工作)?还是C++11标准本身的差距?示例(可以在here中尝试),当使用GCC编译以下代码时:FieldIndexm_inB{"inB",this};不会被执行。但它会在使用CLang编译时执行。变通方法:从FieldIndexContainer派生A作为虚拟#include#include#includeusingnamespacestd;classFieldIndexContainer{public:classFieldIndex{pu

c++ - 为什么抽象派生类需要初始化一个虚基类?

这个问题在这里已经有了答案:Inanabstractclassconstructor,whyIdoneedtocallaconstructorofavirtualbasethatwillnevertocalled?(1个回答)关闭7年前。请看下面的代码:structObject;structComponent{Component(Object*obj){}};structRenderable:publicvirtualComponent{virtualvoidRender()=0;};structAnimationRenderer:publicRenderable{AnimationR

c++ - 使用 protected 非虚拟析构函数时抑制 delete-non-virtual-dtor 警告

我有一个纯抽象接口(interface)类和一个实现该接口(interface)的派生类。structFoo{virtualvoiddoStuff()=0;};structBar:Foo{voiddoStuff()override{}};我的接口(interface)类没有虚拟析构函数。因此,尝试使用基类指针破坏派生实例显然是未定义的行为intmain(){Foo*f=newBar;f->doStuff();deletef;}幸运的是我的编译器足够聪明,可以捕捉到这个(使用-Werror)main.cc:15:9:error:deletingobjectofabstractclasst

c++ - 虚拟继承——gcc 与 vc++

我在使用VisualStudio2008时遇到有关虚拟继承的问题。考虑以下示例:#includeclassPrint{public:Print(constchar*name){std::cout如果我在我的linux机器上使用gcc,这段代码编译得很好。但是,如果我尝试使用VisualStudio在Windows上构建相同的内容,编译将失败并显示错误消息“错误C2614:‘B’:非法成员初始化:‘Print’不是基数或成员。”为什么这不起作用? 最佳答案 来自标准[class.base.init]:“除非mem-initialize

c++ - MSVC9.0 bug 或对虚拟继承的误解和 friend ?

考虑以下代码:classA{friendclassB;friendclassC;};classB:virtualprivateA{};classC:privateB{};intmain(){Cx;//OKdefaultconstructorgeneratedbycompilerCy=x;//compilererror:copy-constructorunavailableinCy=x;//compilererror:assignmentoperatorunavailableinC}MSVC9.0(VisualStudio2008的C++编译器)确实会生成默认构造函数,但无法为C生成复制