草庐IT

Inheritance

全部标签

c++ - 为什么在使用可变构造函数时必须创建类型别名?

我有一个采用N种类型的模板化基类:templateclassBase{};在该基类上使用protected继承时,templateclassDerived:protectedBase{//likeso...};我想另外包括基类的公共(public)构造函数:templateclassDerived:protectedBase{//createanaliasusingParent=Base;//getallconstructorsaswellusingParent::Parent;};这行得通。但是,为什么我必须包含Parent别名?没有它我似乎无法获得构造函数。以下尝试不起作用:tem

c++ - 派生到基础的转换和友元困惑

来自C++Primer第5版(D继承自B)MemberfunctionsandfriendsofclassesderivedfromDmayusethederived-tobaseconversionifDinheritsfromBusingeitherpublicorprotected.SuchcodemaynotusetheconversionifDinheritsprivatelyfromB.这有什么原因吗?还是我打算按表面值(value)来看待它?为什么会这样似乎很明显,但在一个例子中它让我感到困惑:#includeusingnamespacestd;classBase{pub

c++ - 使用基类而不是基指针来处理派生类

我有一个像这样的基础抽象类;classX{public:virtual~X(){}virtualdoSomething()=0;};然后我用几个类(如Y、Z等)来实现它,每个类都有自己的构造函数、析构函数和doSomething实现。在我的主要职能中,我这样做;intmain(){std::vectorv;X*x1=newY();X*x2=newZ();v.push_back(x1);v.push_back(x2);for(autop:v){p->doSomething()}}这会按预期调用相应的doSomething实现。但我的问题是我使用指向抽象类的指针通过其基类来操纵派生类的层次

c++ - 如果构造函数不是继承的,为什么要调用它们?

代码正在打印所有构造函数。我读到当我们从另一个类派生一个类时,构造函数不会被继承。那么为什么c的创建是从b和a调用构造函数classA{public:A(){cout 最佳答案 当您阅读的文档说构造函数“不被继承”时,这意味着如果类A定义了一个构造函数A::A(intx),那么子类B将不会自动具有采用int的构造函数。但是,仍然需要初始化父类的值;否则,父对象可能处于无效状态。构造函数用于初始化类,因此意味着一个父类的构造函数必须从子构造函数的初始化器列表中调用。如果父类有默认构造函数,则默认调用该构造函数。这就是您在示例中看到的。

c++ - 这个函数调用真的有歧义吗?

我正在学习多重继承和菱形问题,当我从最派生类进行函数调用时,VisualStudio告诉我该调用不明确:structA{virtualvoidaFunction(){cout我知道如果我在B类和C类中覆盖了基类函数,那么调用将是不明确的,但是B类和C类中的“aFunction()”不一样吗?此外,让B和C继承自A实际上可以消除错误。但是我对继承时关键字“virtual”的理解,即(Derived:virtualBase)是它阻止链中更下游的“更多派生类”继承链上游Base的多个拷贝。在继承中,可以继承多份成员变量,但只能继承一份同名函数。因此,例如,我可以有5个派生类,每个类都派生自B

c++ - 理解 C++ 中的继承和多态性

假设我们有以下继承类。classA{public:voidvirtualshow(){coutshow();return0;}在不创建任何其他对象的情况下,如何调用B类的show()函数???我知道的一种方法是将C类中的show()修改为,voidshow(){B::show();cout这将首先调用B的show函数,然后打印“IamC”。但是我根本不希望C中的show()被执行。我想让B的show()直接执行。有可能吗?我们可以使用类型转换或其他方式来做到这一点吗?请记住,除了已经创建的对象(即main()中的C)之外,我不允许创建任何其他对象。我在今天的采访中被问到这个问题。谢谢!

c++ - 构造函数链接不使用类成员的默认值?

我有两个类(class)Unit和Archer。Archer继承自unit。我尝试使用构造函数链接来设置基类的统计信息,但如果我使用以下代码,统计信息似乎设置为零:#includeusingnamespacestd;classUnit{intdamage=0;intcurHp=0;intmaxHp=1;intrange=0;intcost=0;public:Unit(int_damage,int_maxHp,int_range,int_cost){damage=_damage;curHp=maxHp=_maxHp;range=_range;cost=_cost;}intgetCost(

c++ - 正确的 C++ 方法来存储多类型数据

假设我有4个字节来描述一些真实的系统参数。假设可以将其解释为float、uint32_t和boolean。将这些变量一起存储和处理的主要思想。现在我使用一个类(非常简化)有4个字节的数组,函数floattoFloat()、uint32_ttoInt()、booltoBool()和参数ID(指定存储值类型)。所以我需要一个函数TgetValue(),它将返回正确类型T的值。所以我的问题是:最正确的方法是什么?我应该使用模板、继承、它们的组合还是其他什么? 最佳答案 你可以使用std::variant:std::variantbytes

C++设计——网络数据包和序列化

对于我的游戏,我有一个Packet类,它表示网络数据包,基本上由一组数据和一些纯虚函数组成然后我想要派生自Packet的类,例如:StatePacket、PauseRequestPacket等。这些子类中的每一个都将实现虚函数Handle(),当一个这些数据包中的一部分被接收,以便它可以完成它的工作,几个获取/设置函数将读取和设置数据数组中的字段。所以我有两个问题:(抽象的)Packet类需要是可复制和可分配的,但没有切片,保留派生类的所有字段。派生类甚至可能没有额外的字段,只有函数,可以与基类上的数组一起使用。我怎样才能做到这一点?在序列化的时候,我会给每个子类一个唯一的数字ID,然

c++ - 具有派生类的自定义容器的迭代器

我有一个自定义容器,它以两种不同的方式实现,但只有一个界面。像这样的事情。classVector{virtualIteratorbegin()=0;virtualIteratorend()=0;...//somemorefunctions.};classVectorImplA:publicVector{Iteratorbegin(){returnm_data.begin();}Iteratorend(){returnm_data.end();}private:SomeFloatContainerm_data;};classVectorImplB:publicVector{Iterato