草庐IT

C++:虚拟继承

全部标签

c++ - 继承层次结构 : Constructor & Destructor execution sequence

在这里http://www.parashift.com/c++-faq-lite/multiple-inheritance.html[25.14]节说Theveryfirstconstructorstobeexecutedarethevirtualbaseclassesanywhereinthehierarchy.我尝试使用以下程序验证它:A(purevirtual)|B|C(virtual)/\(virtual)ED\/F|G(purevirtual)|H每个类都有一个c'tor和virtuald'tor。输出如下:ABCEDFGH~H~G~F~D~E~C~B~APressanyke

c++ - 在C++中使用模板成员函数继承模板类

问题:我收到以下代码的以下错误,有人知道为什么吗?问题:我正在研究一个类(ClassB),它控制来自外部库(libMesh)的多个类的行为。“...做某事...部分代码旨在在这些具有模板函数的外部库类中设置一些变量。我希望能够从继承类(ClassC)的构造函数中设置其中一些值。但是,如果我这样做,就像下面的代码一样,我会得到显示的错误。如果我在构造函数中删除此命令,它就可以正常工作。我还提供了一个更详细的示例,该示例会产生相同的错误,但使用了libmesh类本身,它说明了我想做得更好一点。我不确定我正在尝试做的事情是否有用,我主要想知道为什么这不起作用,因为它似乎应该起作用。我找到了另

c++ - 不明确的类继承

#include#includeusingnamespacestd;classTcirculo{floatradio;floatdiametro;floatarea;public:voidcarea(floatr){radio=r;area=(M_PI*((r*r)));}floatcdiam(floatr){diametro=2*r;returndiametro;}floatgetr(){returnradio;}floatgetd(){returndiametro;}floatgeta(){returnarea;}};classTrectangulo:publicTcirculo{

C++ 使用自己的类的元素继承堆栈

我正在尝试创建自己的类(NodeWithMin)作为C++中堆栈的元素,并创建一个继承它的新类(StackWithMin)。我想我可以创建新的堆栈类,但是在初始化新类的新实例并使用它时遇到一些问题。有人对此有好主意吗?我将所有类和主要内容写在一个文件中。谢谢。#includeclassNodeWithMin{public:intvalue;intmin;NodeWithMin(intv,intmin){this->value=v;this->min=min;}};templateclassStackWithMin:stack{public:typedefstacksuper;voidp

c++ - 在具有菱形继承和虚拟基类的类中调用函数的策略

如果我们有菱形继承并使用公共(public)虚拟基类,我们可以阻止第一个构造函数被多次调用。现在,我想对构造函数之外的函数做同样的事情。例如代码:#includestructA{virtualvoidfoo(){std::cout产生结果ABACD我想修改它,让它只产生ABCD什么样的策略或模式可以做到这一点?编辑1与以下相比,我更喜欢TonyD的回答。尽管如此,理论上可以使用另一个类的构造函数来定义适当的函数层次结构。具体#includestructA;structB;structC;structD;namespacefoo{structA{A(::A*self);};structB

C# 编码 C++ 结构继承

假设我在C++中有以下结构structBase{USHORTsize;}structInherited:publicBase{BYTEtype;}我想在C#中编码Inherited但结构继承在C#中不起作用。做以下是否合适?publicinterfaceIBase{ushortSize{get;set;}}[StructLayout(LayoutKind.Sequential)]publicstructInherited:IBase{publicushortSize{get;set;}publicbyteType{get;set;}}我在这里简化了问题,我的结构更大,因此很难验证结果。

c++ - 简单虚拟机安全、高效的底层数据类型

前段时间我创建了一个简单的模拟计算机。它有外围设备、可以渲染为OpenGL纹理的屏幕缓冲区,以及其他一些简洁的功能。它运行良好,运行良好,总的来说我很满意。除了,我作弊了。底层数据类型是整数、float和指令类型的union(拆分为位字段)。对于任何正确的(模拟的)程序,union总是被安全地使用,只从写入的最后一个union成员读取。但是,格式错误的程序(例如从模拟硬盘驱动器加载)可能会乱序访问成员,这可能会使我面临与union滥用相关的常见问题:可以在编译时优化写入的可能性——编译器可能没有足够的信息来尝试这种优化从union中读取的值可能是垃圾-这对我来说是完全可以接受的行为。以

C++多菱形继承和纯虚函数

考虑以下架构:classA//abstractinterface{public:virtualvoidf()=0;};classAA:publicA//abstractinterface{public:virtualvoidg()=0;};classAAA:publicAA//abstractinterface{public:virtualvoidh()=0;};classB:publicA//implementationclass{public:voidf()override{};};classBB:publicB,publicAA{};//implementationclass{p

c++ - 继承和属性打包

在C++中考虑这段代码structBase{std::int64_tx;std::int64_ty;};static_assert(sizeof(Base)==16,"Basenotofsize16!");structDerived:Base{std::int32_tz;}__attribute__((packed));static_assert(sizeof(Derived)==20,"Derivednotofsize20!");clang认为此代码有效,而gcc导致触发第二个static_assert。(“Derivednotofsize20!”)。如果我也添加打包在Base中的属

c++ - 关于来自 VC12 和 VC14 的 c++ 友元和继承的不同行为

classBase{protected:voidfunc1();};classDerived:publicBase{friendclassThird;};classThird{voidfoo(){Derived;d.func1();}};我可以在VC14(VisualStudio2015)中编译代码而不会出错但从VC12(VisualStudio2013)得到错误cannotaccessprotectedmemberdeclaredinclass'Base'谁是对的?这种具有继承性的友元的正确性是什么?来自MSDNhttps://msdn.microsoft.com/en-us/lib