草庐IT

c++ - 使用移动语义将基类实例插入子类实例

假设我有一个实例化的Baseb。Foo是Base的子类。我想要做的是拥有一个Foo的构造函数classFoo:publicBase{Foo(Baseb,TotherArg):Base(b){/*ToDo-dosomethingwithotherArg*/}}将“b”实例移动到正在构建的Foo实例。如果Foo的构造失败(例如,在我的/*ToDo步骤*/中),则不应移动b。我可以在C++11中执行此操作吗?(我买不起深拷贝)。构造函数原型(prototype)是否需要为Foo(Base&&b,TotherArg)? 最佳答案 是的,你可

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

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

c++ - 将从基类继承的构造函数与自定义构造函数混合

给定以下示例:structtag1{};structtag2{};templateclassBase{public:Base(T/*value*/){}Base(tag1){}};templateclassBase{public:Base(){}Base(tag1){}};templateclassMyClass:publicBase{public:usingBase::Base;MyClass(tag2):Base(tag1{}){}};intmain(){{MyClassdefaultConstructible;MyClasstagConstructible(tag2{});}{M

c++ - 从非模板基类扩展并覆盖函数参数的模板类

我正在尝试为PacketDecoder创建一个非模板基类,以便我可以将Base*存储在std::map中。解码功能被正确覆盖。编码函数给我这个错误“'编码'不是虚拟的,不能声明为纯”。我可能会从Java背景中错误地考虑这个问题。是否有更惯用的C++方法来解决这个问题?classBase{public:virtualPacket*decode(folly::io::Cursor&cursor)=0;virtualvoidencode(Packet*packet)=0;};template::value>::type*=nullptr>classPacketDecoder:publicBa

c++ - C++ 中的私有(private)基类可访问性

我最近不得不做这样的事情:classA{};classB:privateA{};classC:publicB{public:A*myA;};intmain(){return0;}而且我在尝试的三个编译器中都遇到了错误。当我将myA的声明更改为::A*myA时,一切正常。我查阅了C++标准,发现第11.2节第3段说:Note:Amemberofaprivatebaseclassmightbeinaccessibleasaninheritedmembername,butaccessibledirectly.哪个相关,但不清楚。为什么名称A不可访问?如果不隐藏A会出现什么问题?谢谢,-本

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

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

c++ - 测试子类是否覆盖基类中的虚函数

我正在寻找一种方法来检查子类是否覆盖了其基类上的函数。如果成员函数指针不是虚拟的,则比较成员函数指针工作得很好,但如果它们是是虚拟的,则它不起作用。这个示例代码基本上就是我遇到的问题。classBase{public:virtualvoidvfoo(){cout从逻辑上讲,没有理由不这样做,但C++规范另有规定(以这种方式比较虚函数地址是实现定义的)。在GCC上,输入双关语&Base::vfoo和&Child::vfoo到int使它们都为“1”(vbar为“9”),这看起来是vtable偏移量。以下代码似乎正确地从vtable中获取了函数地址,并正确地报告了Child::vfoo和Ba

c++ - 需要从DLL导出纯基类?

我有两个DLL:a.dll和b.dll,每个DLL都有一个类AClass和BClass。我想让AClass和BClass继承并实现相同的接口(interface)AbsBase,这是一个纯抽象类。在每个类中,我为__declspec(dllimport)和__declspect(dllexport)设置了#defines。当我尝试编译时,我得到了这个:warningC4275:nondll-interfaceclass'AClass'usedasbasefordll-interfaceclass'AbsBase'这基本上是要我将AbsBase声明为__declspec(dllexpor

c++ - 使用基类的静态函数而不指定参数以避免歧义

我的一些基类获得大量参数。现在我想指定使用哪个静态函数:templatestructSBase{staticvoidfunc(){}};structA:publicSBase{};structB:publicA,publicSBase{//usingSBase::func;//Notpossible.//Horrible,butworks.usingSBase::func;};如您所见,我需要将模板参数写两次,导致代码重复。有什么办法可以摆脱它吗? 最佳答案 你可以使用typedef:typedefSBaseB_SBase;stru

c++ - 从抽象基类成员函数调用纯虚函数?

因此,基于粗略的搜索,我已经知道从构造函数调用虚函数(纯或其他)是行不通的。我已经重组了我的代码以确保我没有这样做。虽然这会导致我的类的用户在他们的代码中添加额外的函数调用,但这真的没什么大不了的。也就是说,他们现在不再在循环中调用构造函数,而是调用函数(实际上!)提高了代码的性能,因为我们不需要每次都构建和销毁相关对象。然而,我偶然发现了一些有趣的事情......在抽象类中我有这样的东西://inAbstractClass.h:classAbstractClass{public:AbstractClass(){}virtualintFunc();//usercanoverridepr