草庐IT

virtual-inheritance

全部标签

c++ - 与 C++ 中的 virtual 关键字混淆

我正在研究C++中virtual关键字的效果,我想出了这段代码。#includeusingnamespacestd;classA{public:virtualvoidshow(){coutshow();ac->show();bc->show();}预期的输出是:BCB因为B中的show函数是非虚拟的。但是编译时的结果是:BCC它的行为就好像B中的show函数是虚拟的。为什么会这样?B类在这里被覆盖了吗?如果我将C类指向B类,我怎么会指向A类? 最佳答案 根据C++2017标准(10.1.2函数说明符)2Thevirtualspeci

c++ - 修复 C++ 多重继承不明确调用

我有三个结构如下的类:#includeusingnamespacestd;classKeyword{public:virtualfloatGetValue()=0;};classCharacterKeyword:publicKeyword{public:virtualfloatGetValue(){return_value;}private:float_value;};classMeasurementKeyword:publicKeyword{public:virtualfloatGetValue(){return_value;}private:float_value;};classA

c++ - 虚拟继承不会破坏静态组合?

过去5年我一直在假设虚拟继承打破了静态组合。但现在我发现,静态组合仍然存在,只是关于正确实例位置的附加信息。这样对吗? 最佳答案 非虚拟继承中的数据布局:classPoint2d{intx_,y_;};classPoint3d:publicPoint2d{intz_;};点2d:+--------------+|intx_|+--------------+|inty_|+--------------+Point3d:+--------------+--+|intx_||+--------------++--Point2dsubobj

c++ - 无法理解 C++ `virtual`

我无法理解C++中virtual关键字的用途。我非常了解C和Java,但我是C++的新手来自维基百科Inobject-orientedprogramming,avirtualfunctionorvirtualmethodisafunctionormethodwhosebehaviorcanbeoverriddenwithinaninheritingclassbyafunctionwiththesamesignature.不过,我可以在不使用virtual关键字的情况下覆盖如下所示的方法#includeusingnamespacestd;classA{public:inta();};in

c++ - 多重虚拟继承中的虚拟表和内存布局

考虑以下层次结构:structA{inta;A(){f(0);}A(inti){f(i);}virtualvoidf(inti){coutC实例的确切内存布局是什么?它包含多少个vptr,每个vptr的确切位置?哪些虚表与C的虚表共享?每个虚拟表到底包含什么?这里是我对布局的理解:----------------------------------------------------------------|vptr1|AptrOfB1|b1|B2ptr|c|vptr2|AptrOfB2|b2|a|--------------------------------------------

c++ - "method injection"的这种虚拟继承使用模式是已知范例吗?

昨天,我遇到了这个问题:forcingunqualifiednamestobedependentvalues最初,这似乎是一个与破坏VC++行为相关的非常具体的问题,但是在尝试解决它时,我偶然发现了一种我以前从未遇到过的虚拟继承的使用模式(我会在告诉你之后解释一下)我的问题)。我发现它很有趣,所以我在SO和google上寻找它,但我找不到任何东西。也许,我只是不知道它的正确名称(“方法注入(inject)”是我的猜测之一)而且它实际上广为人知。这也是我向社区提出的问题的一部分:这是一种常见的使用模式还是另一种已知范式的特例?您是否看到可以通过不同的解决方案避免的任何问题/陷阱?这个模式

c++ - 当我从虚拟基派生 D 时,为什么 VS2015 中的 sizeof(D) 增加了 8 个字节?

我正在使用C++14§3.11/2中的示例:structB{longdoubled;};structD:virtualB{charc;}在clang、g++和VS2015中运行下面的代码片段之后#includestructB{longdoubled;};structD:/*virtual*/B{charc;};intmain(){std::cout我得到了以下结果:clangg++VS2015sizeof(longdouble)16168alignof(longdouble)16168sizeof(B)16168alignof(B)16168sizeof(D)323216alignof

c++ - 虚拟继承的虚拟函数表中的虚拟基址偏移量

代码如下(在Ubuntu16.04上用G++-5.4编译的C++11代码):#includeusingnamespacestd;classBase{public:virtualvoidshow(){cout我尝试使用GDB检查对象“obj_a”的内存布局(首先,我设置了“setprintobjecton”、“setprintprettyon”、“setprintvtblon”、“setprintasm-demangleon"在GDB中):(gdb)psizeof(obj_a)$1=32(gdb)x/8aw&obj_a0x7fffffffe320:0x400d200x00x1f0x00x

c++ - gcc 4.5.1 虚拟继承问题

让我们从代码片段开始:#includestructGod{God(){_test=8;}virtual~God(){}int_test;};structBase1:publicvirtualGod{//Base1(){std::cout_test_test使用GCC4.5.1和4.6.1编译Derived类的构造函数之间的唯一区别是第一个明确说明应该调用哪个Base1构造函数。我希望main()中的两个cout都打印8。不幸的是第一个打印0!。为什么?如果我启用Base1构造函数的显式定义,它可以解决问题。如果我在派生类定义(派生类:publicA1,publicA2)中删除虚拟继承,

c++ - 如何正确链接 boost::mpl::inherit_linearly 和 boost::mpl::inherit 以便解析占位符?

假设我有这些类型:templateclassStorage>structAbstractFactoryUnit{virtual~AbstractFactoryUnit(){}virtualtypenameStorage::StoredTypedoCreate(Storage)=0;};和templateclassProductStorage,templateclass>classUnit=AbstractFactoryUnit>structAbstractFactory:boost::mpl::inherit_linearly>>::type{typedefTypeSequencePr