jjzjj

c++ - 在多态性增加派生类大小的多重继承的情况下,在派生类中为析构函数编写代码。为什么?

#includestructBase1{public:virtualvoidshow()=0;};structBase2{public:virtualvoidDisplay()=0;};classDerived:virtualpublicBase1,virtualpublicBase2{public:virtualvoidshow(){}virtualvoidDisplay(){}};voidmain(){usingnamespacestd;cout输出显示12但是当我插入Dervied类的析构函数时,即以下代码#includestructBase1{public:virtualvoi

c++ - 使用多重继承实现Entity-Component编程

我读过几篇关于实体组件编程风格的文章。常见的问题之一是如何表达组件之间的依赖关系,以及与同一实体相关的组件如何通信。在我看来,这个问题的一个简单解决方案是使每个依赖项成为其依赖项的虚拟基类。这样,当一个组件包含在一个实体中时(通过虚拟继承),所有依赖的组件都只包含一次。此外,组件所依赖的所有功能都将在其成员函数中可用。classC_RigidBody:publicvirtualC_Transform{publicvoidtick(floatdt);};classC_Explodes:publicvirtualC_Transform{publicvoidexplode();};class

c++ - 非抽象但无状态的类对于多重继承是否与纯抽象类一样安全?

在大多数书籍和文章中,进行多重继承的唯一“安全”(或者至少是唯一建议的)方法是使用纯抽象基类(您可以称为虚拟接口(interface))的虚拟继承。原因主要是为了避免菱形继承(钻石问题),在菱形继承(钻石问题)中,人们可能会为数据成员的值或非纯虚函数的实现状态造成歧义。纯抽象基类不会同时遭受(没有数据成员,没有非纯虚拟)和虚拟继承甚至解决了基类实际内存地址的歧义。但是给出这样的解释:如果歧义仅来自“状态”的形式(例如数据成员、静态函数变量),那么就不是无状态非抽象(甚至可能具有所有“最终”方法)类作为多继承层次结构中的基类是否同样安全?我遗漏了什么可能的问题?PS:如果答案是“如果没有

c++ - 在派生类的基类构造函数中使用重写函数

我是C++编程的新手,所以我想编写一些简单的代码来熟悉语法。我暂时故意忽略了指针和引用。在编码过程中,我正在练习继承,我想创建一个代表一手牌的Hand类。基类有一个名为update()的函数,用于在构造时初始化“total”和“notation”属性。此外,可以使用add()函数将卡片添加到手中,该函数将卡片添加到手中并触发update()以适本地更新属性。#includeclassHand{public:std::vectorcards;inttotal;std::stringnotation;//Abbreviatednotationoftheobject//Constructor

c++ - 界面无法识别

我在自己的头文件MyInterface.h中声明了一个接口(interface):classMyInterface{public:virtual~MyInterface(){}virtualvoidinitialize()=0;virtualvoidnewValueSound(intstream,doublevalue)=0;virtualvoidnewValueAlg1(intstream,doublevalue)=0;virtualvoidnewValueAlg2(intstream,doublevalue)=0;};每当我包含此header并尝试使用该接口(interface)时

c++ - 通过覆盖加入多个重叠的类?

我想知道以下案例,但我显然缺少足够的术语来在任何地方找到任何答案。让我们从一个常见的案例开始:我总共有3个类。其中2个继承自第三个,应视为特化。现在这3个类仍然是部分抽象的,并且每个都引入了新的纯虚函数,因为这种“类结构”可以针对不同的目的以不同的方式实现。并且这3个类中的每一个都从内部访问纯虚函数,因此它们不能在以后实现。然后是第4类,它继承自第2类,以专门用于第2类的纯虚函数的用途。还有一个第5类,它对第3类做同样的事情。现在还有1级的纯虚函数,需要根据4级和5级专门化。这是我遇到一些问题的地方,我可以想出2种方法来解决这个问题,但我并不真正满意。让第6类继承自第1类,并根据第4类

c++ - 无法实现接口(interface)的 [[deprecated]] 方法

我想将我界面的某些方法标记为已弃用。为了向后兼容,我需要在一段时间内支持旧方法。//myowninterfaceforotherinterfaceI{[[deprecated("use'bar'instead")]]virtualvoidfoo()=0;};但是VisualStudio2015不允许我实现这个接口(interface)://myownimplementationclassIImpl:publicI{public:virtualvoidfoo()override;//heregoeswarningC4996://'I::foo':wasdeclareddeprecated

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++ - 以下会不会引起内存问题?

假设我在DLL实现中有以下内容(例如,它会有一个cpp文件):classBase{protected:Something*some;public:virtualvoidinit(){some=newSomething();}virtual~Base(){deletesome;}};然后在我的exe文件中:classDerived:publicBase{public:virtualvoidinit(){some=newSomethingElse();}};intmain(){Base*blah=newDerived;deleteblah;}如果DLL在与exe不同的运行时运行,这会不会导

c++ - 调用基础运算符而不是派生运算符 - 正常行为?

由于我目前正在使用C++,我遇到了一个问题。代码如下:#includeclassBase{public:virtual~Base(){}virtualBase&operator=(constBase&o){std::cout(b);//Derivedcalleda=d;//Derivedcalledc=d;//Derivedcalledreturn(0);}评论显示了我得到的输出。最后3个结果非常可预测,但我无法理解第一个。如第二个(static_cast)所示,当右操作数是基类时调用Derived::operator=。然而,g++(4.5.3-r2,gentooLinux)成功理解