草庐IT

特定基类的 C++ 类模板

假设我有类(class):classBase{};classA:publicBase{inti;};classB:publicBase{boolb;};现在我想定义一个模板类:templateclassBasePair{T1first;T2second;};但我想将其定义为只有Base类的后代可以用作模板参数。我该怎么做? 最佳答案 C++11引入templateclassBasePair{static_assert(std::is_base_of::value,"T1mustderivefromBase");static_asse

c++ - 使用 C++ 基类构造函数?

在使用模板时,我遇到了需要使基类构造函数可以从继承的类中访问以创建对象以减少复制/粘贴操作。我正在考虑通过using关键字以与函数大小写相同的方式执行此操作,但这不起作用。classA{public:A(intval){}};classB:publicA{};classC:publicA{public:C(conststring&val){}};classD:publicA{public:D(conststring&val){}usingA::A;//g++error:A::Anamesconstructor};voidmain(){Bb(10);//Ok.(A::Aconstruct

c++ - 如果与基类相比没有新的成员变量,C++ 是否允许增加派生类的大小?

假设我有一个包含一些成员变量但没有虚函数的基类:classBase{intmember;};以及从Base以非虚拟方式派生的派生类,并且没有新的成员变量,也没有虚拟函数:classDerived:Base{};显然sizeof(Derived)不能小于sizeof(Base)。sizeof(Derived)是否必须等于sizeof(Base)? 最佳答案 从5.3.2[expr.sizeof]Whenappliedtoaclass,theresult[ofsizeof]isthenumberofbytesinanobjectofth

c++ - 基类中的静态变量是否由所有派生类共享?

如果我有类似的东西classBase{staticintstaticVar;}classDerivedA:publicBase{}classDerivedB:publicBase{}DerivedA和DerivedB会共享相同的staticVar还是各自拥有自己的?如果我希望他们每个人都有自己的,你会建议我做什么? 最佳答案 它们将共享相同的staticVar实例。为了让每个派生类都有自己的静态变量,您需要声明另一个具有不同名称的静态变量。然后,您可以在基类中使用一对虚拟函数来获取和设置变量的值,并在每个派生类中覆盖该对,以获取和设

c++ - 将成员函数从基类移动到派生类会无缘无故地破坏程序

This(made-up)questionwasinitiallyformulatedasapuzzle,concealingsomeofthedetailsthatmighthelpseeingtheproblemfaster.ScrolldownforthesimplerMCVEversion.原始(拼图)版本我有这段代码输出0:#include#includeusingnamespacestd;regexsig_regex("[0-9]+");boololdmode=false;templatestructB{Tbitset;explicitB(Tflags):bitset(fl

c++ - unique_ptr 到派生类作为函数的参数,该函数将 unique_ptr 带到基类

我正在尝试使用unique_ptr到接受unique_ptr的函数中的派生类到基类。比如:classBase{};classDerived:publicBase{};voidf(unique_ptrconst&base){}…unique_ptrderived=unique_ptr(newDerived);f(derived);如果我理解thisanswer正确地,这段代码应该可以工作,但它会导致以下编译错误:errorC2664:'f':cannotconvertparameter1from'std::unique_ptr'to'conststd::unique_ptr&'Intel

c++ - 将派生类对象存储在基类变量中

我想在一个vector中存储几个类的实例。由于所有类都继承自同一个基类,这应该是可能的。想象一下这个程序:#include#includeusingnamespacestd;classBase{public:virtualvoididentify(){coutvect;vect.push_back(derived);vect[0].identify();return0;}我希望它打印"DERIVED",因为identify()方法是virtual。相反,vect[0]似乎是一个Base实例,它会打印"BASE"。我想我可以编写自己的容器(可能源自vector)以某种方式能够做到这一点(

c++ - 如何从基类公开继承,但在派生类中将基类的一些公共(public)方法设为私有(private)?

例如,Base类有两个公共(public)方法:foo()和bar()。Derived类继承自Base类。在Derived类中,我想将foo()设为公开,而将bar()设为私有(private)。以下代码是正确且自然的方法吗?classBase{public:voidfoo();voidbar();};classDerived:publicBase{private:voidbar();}; 最佳答案 C++'03标准的第11.3节描述了这种能力:11.3AccessdeclarationsTheaccessofamemberofab

c++ - 当基类不是时,为什么派生类可以 move 构造?

考虑以下示例:#include#include#includetemplatestructFoo:publicBase{usingBase::Base;};structBar{Bar(constBar&){}Bar(Bar&&)=delete;};intmain(){std::cout::value>::value为什么编译器生成一个move构造函数,尽管基类是不可move构造的?这是标准还是编译器错误?是否可以“完美地传播”将构造从基类move到派生类? 最佳答案 因为:Adefaultedmoveconstructorthati

c++ - 在 C++11 中显式删除了成员函数,从不可复制的基类继承是否仍然值得?

在C++11中显式删除了成员函数,是否仍然值得从不可复制的基类继承?我说的是你私下继承基类的技巧,该基类具有私有(private)或已删除的复制构造函数和复制赋值(例如boost::noncopyable)。在此question中提出的优点是什么?仍然适用于C++11?我不明白为什么有些人声称在C++11中使类不可复制更容易。在C++03中:private:MyClass(constMyClass&){}MyClass&operator=(constMyClass&){}在C++11中:MyClass(constMyClass&)=delete;MyClass&operator=(co