草庐IT

C++:虚拟继承

全部标签

c++ - C++ 中带有混合插件的奇怪循环继承

这里有什么好的解读循环继承的方法?classNode{//...public:listneighbors(){/*...*/}voidupdate(){}}templateclassHasImportance:publicvirtualNodeType{doublem_importance=0.0;public:voidreceive_importance(doubleimp){/*...*/}voidgive_importance(){for(autoneighbor:this->neighbors())neighbor->receive_importance(m_importanc

c++ - 虚拟继承是如何工作的?

很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visitthehelpcenter.关闭10年前。虚拟继承是否使用vTable?如果是或否,那么它是如何实现的虚拟继承在内存中的表现如何?虚拟继承的任何其他替代方案非常感谢概念性的解释。

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

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

c++ - 多重继承的虚函数表

示例代码如下:classA{public:intk;virtualintf();};classB:publicvirtualA{public:virtualinta();};intmain(){cout打印812似乎B类有自己的新虚函数表。如果A类更改为:classA{public:virtualintf();};打印44谁能解释一下原因? 最佳答案 在您的子类B中,B是A的虚拟子类。因此,B在子对象A的指针之上有一个单独的vtbl指针(4字节)。因此,sizeof(Bobject)=sizeof(Aobject)+sizeof(v

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++ - 虚继承与多态 : Is the cereal library messing with object layout?

我有四个类(A、B、C和D)遵循经典菱形图案和Container包含unique_ptr的类.我想使用cereal序列化这些类序列化库。structA{intf1;intf2;intf3}structB:publicvirtualA{templateinlinevoidsave(Archive&ar)const{std::cerrf1)f2)f3)f1f2f3CEREAL_REGISTER_TYPE(B);CEREAL_REGISTER_TYPE(C);CEREAL_REGISTER_TYPE(D);structContainer{std::unique_ptrobj;template

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++ - 涉及私有(private)继承的 C 风格向上转型和向下转型

考虑以下代码:-classA{};classB:privateA{};B*bPtr1=newB;//A*aPtr1=bPtr1;//error//A*aPtr2=static_cast(bPtr1);//errorA*aPtr3=(A*)bPtr1;B*bPtr2=(B*)aPtr3;当隐式和static_cast都失败时(还有dynamic_cast),C风格的转换丢弃了私有(private)继承。为什么?如果C风格的转换只是一些小事,那么C++转换是如何实现的,即它们如何从内存占用中知道继承类型?在将bPtr1转换为aPtr3之后,我将不得不使用另一个C风格的转换来向下转换为B,因

云计算底层技术奥秘、磁盘技术揭秘、虚拟化管理、公有云概述

云计算基础实验图例虚拟化平台安装创建虚拟机1、创建虚拟机2cpu,4G内存(默认用户名:root密码:a)2、验证ecs是否支持虚拟化[root@ecs~]#grep-Po"vmx|svm"/proc/cpuinfovmx......[root@ecs~]#lsmod|grepkvmkvm_intel1748416kvm5785181kvm_intelirqbypass135031kvm安装虚拟化平台1、安装服务[root@ecs~]#dnfinstall-yqemu-kvmlibvirt-daemonlibvirt-clientlibvirt-daemon-driver-qemulibvir

c++ - 防止两个类从具有相同模板参数的基类继承

我有一个假设是基类的类:templateclassBaseClass{...};如果两个类尝试使用相同的ID值从该基类继承,我该如何使编译时错误出现。也就是说-这段代码应该可以工作:classA:BaseClass{...}classB:BaseClass{...}但是这段代码可能会导致错误:classA:BaseClass{...}classB:BaseClass{...}如何才能做到这一点?BOOST_STATIC_ASSERT有帮助吗? 最佳答案 我认为这是不可能的。如果可能,那么我们也可以让编译器为以下代码生成错误,这在概念