草庐IT

派生词

全部标签

c++ - 函数应该返回指向派生类还是基类的指针?

当一个函数需要返回一个对象时。它应该通过指向derived还是base的指针返回它?classB{}classD:publicB{}//way1:returnpointertoderivedD*createDerived(){D*d=newD();returnd;}//way2:returnpointertobaseB*createDerived(){B*d=newD();returnd;}我听说过“面向接口(interface)而不是实现的程序”,它建议我们应该返回一个指向基的指针。然而我的直觉告诉我在这种情况下最好返回一个指向派生的指针,因为如果客户端代码使用基指针,这个函数仍然可

c++ - 在派生类中重载模板运算符

这个问题在这里已经有了答案:SFINAEmethodcompletelydisablesbaseclass'stemplatemethodinclang(1个回答)关闭3年前。给定一个基类和一个派生类,它们都使用SFINAE为特定参数类型提供有条件启用的运算符:#includeclassBase{public:template>*=nullptr>voidoperator>>(T&value){}};classDerived:publicBase{public:usingBase::operator>>;template>*=nullptr>voidoperator>>(T&value

c++ - 我们是否应该从派生类调用基类移动复制/赋值构造函数

我知道,只要在派生类中定义了自定义复制构造函数或赋值运算符,那么这些方法就有责任调用基类的相应方法。现在我的重点是移动构造函数。假设以下是我的移动构造函数。我有两种调用基类构造函数的方法。取自hereDerived(Derived&&d):Base(d)-->FormA{}Derived(Derived&&d):Base(std::move(d))-->FormB{}现在哪种方法是正确的。根据我的理解和帖子的最后一个答案,使用FormB将是危险和不正确的,因为当调用派生类构造函数时对象将被取消。但是在formA中调用基类复制构造函数。调用FormA会更好吗?类似地,在移动复制赋值运算符

c++ - 派生类的虚表,除了父类虚函数外没有任何虚函数

是否将为派生类创建虚表,派生类除了父类之外没有任何虚函数,一个虚函数不被派生类覆盖。例如:classA{public:virtualvoidshow();};classB:publicA{};B类的虚表怎么样 最佳答案 您的问题没有标准答案。它实际上取决于编译器版本。C++中没有指定标准ABI。如果您对更深入的内容感兴趣,请查看“ItaniumC++ABI”或尝试通过查看汇编代码自行寻找答案。甚至有人提议为C++定义可移植的ABIhttp://www.open-std.org/jtc1/sc22/wg21/docs/papers/2

c++ - 在对象构造期间获取大多数派生类型

在我的项目中,我有一个抽象基类“Base”。我想跟踪从“Base”派生的对象的所有动态分配/解除分配。为此,我覆盖了“Base”中的新建/删除运算符。在覆盖的new运算符中成功分配内存后,我想通知我用于跟踪内存的对象分配已经发生,分配的最派生类型及其大小。大小不是问题(因为它直接传递给“Base”的新运算符),但获取最派生类型是一个问题。我倾向于认为这在我尝试做的方式中是不可能的。由于尚未构建对象的更多派生部分,因此无法知道它们是什么。但是,“基”类的重载新运算符对最终产品有所了解-大小-那么是否有可能了解有关它的其他信息?对于上下文:void*Base::operatornew(si

c++ - 使用模板没有开销的派生类?

我正在努力完成以下任务:对象。对象的调试版本在函数中具有用于跟踪目的的额外功能。现在,我目前有一个使用宏的编译时解决方案,如果库未使用正确的标志编译,它会解析为do{}while(0)。我想将此功能改为在运行时启用。执行此操作的最佳方法是什么?我想这样做:Base*obj=(isGlobalDebugEnabled)?newDebug(...):newBase(...);类型的东西。我想要这样的东西是不是越界了?请注意,标准虚函数并不能真正解决问题,因为每个函数都必须在对象的派生(调试)版本中进行复制,这违背了目的。此外,最低级函数的容量非常大(分析时>6000亿次调用),因此我想为“

C++ 多态性和派生类类型 - "ugly programming"带指针类型转换

首先,我不确定如何用一行来准确描述我正在做的事情...因此标题有点模糊。我能给出的问题的最简短描述是“我有一个函数,它应该能够将许多可能类型的类中的任何一种作为参数,并且这些类都是从基类派生的”.具体来说,我有2个类别的类,它们都实现了不同类型的方法,它们相似但不完全相同。也许我只举个例子会更好?你会看到我用指针类型转换做了一些有点奇怪的事情。我不认为这些是好的编程习惯。它们至少有点奇怪,我想知道是否有更好的替代方法。好的,下面是我对简化示例的尝试:classdevice{//Nothinghere-abstractbaseclass}classinputDevice:device//

c++ - 我可以将 CRTP 与多个派生类一起使用,并以多态方式使用它们吗?

我有这样的类层次结构:templateclassCrtpBase{protected:Type&real_this(){returnstatic_cast(*this);}};templateclassBase:CrtpBase{public:voidfoo(){this->real_this().boo();}};classDerived1:publicBase{public:voidboo{...}};classDerived2:publicBase{public:voidboo{...}};问题是,我想以这种方式使用我的类:std::vectorbase_vec;base_vec

c++ - 我应该从私有(private)派生类指针转换到它的基类吗?

我从C++FAQ中找到的Generally,No.Fromamemberfunctionorfriendofaprivatelyderivedclass,therelationshiptothebaseclassisknown,andtheupwardconversionfromPrivatelyDer*toBase*(orPrivatelyDer&toBase&)issafe;nocastisneededorrecommended.HoweverusersofPrivatelyDershouldavoidthisunsafeconversion,sinceitisbasedonapr

c++ - 模板参数中的派生类类型不编译

这是我无可救药地坚持的代码片段。templateclassC;structbase{inti;}b;structderived:base{}d;Cobj;为什么会报错couldnotconverttemplateargument&dtobase*? 最佳答案 当将参数与指针/引用参数相匹配时,即使转换在其他情况下有效,也不会考虑派生到基数的转换。14.3/5[标准报价仅供引用]Ifanon-typetemplate-argumentcannotbeconvertedtothetypeofthecorrespondingtemplat