jjzjj

使用将在派生构造函数中构造的参数调用的 C++ 基本构造函数

问题1)classBase{Base(std::stringname);virtualstd::stringgenerateName();}classDerived:Base{Derived();virtualstd::stringgenerateName();}问题来了:将在generateName()上调用什么方法?Derived::Derived:Base(generateName()){//whatmethodwillbecalledongenerateName()?}问题2)我应该怎么做?如果默认构造函数必须接受一个参数,但我需要在Derived构造函数中生成该参数?

c++ - 错误 LNK2001 : unresolved external symbol C++

在我之前编译良好的VC++代码中,我添加了一个函数X(),如下所示:InthefileBaseCollection.hclassBase{//codevirtualHRESULTX();//code};INthefileDerivedCollection.hclassDerived:publicBase{HRESULTX();}InthefileDerivedCollection.cppHRESULTDerived::X{//definitionofDerivedhere.}已将头文件正确地包含在.cpp文件中。但我仍然不明白为什么会出现链接错误:errorLNK2001:unreso

派生对象上基于 C++11 范围的 for 循环

如果我有一个指向父类的指针vector,并且该vector是通过实例化从父类派生的对象来初始化的,那么我似乎无法使用基于范围的for循环来获取元素作为派生对象。这是一个简单的例子:#includeclassParent{};classDerived:publicParent{};intmain(){std::vectorobjects{newDerived(),newDerived()};for(Derived*d:objects){//ERROR//Used}return0;}有没有一种干净的方法来做我想做的事(即循环遍历派生对象)?我知道可以做这样的事情:for(Parent*p:

c++ - 在基类和派生类中 copy-and-swap

我最近读到copy&swap现在我正在尝试在基类和派生类中实现ctors。我的基类和派生类中都有四个构造函数,但是我不确定如何实现派生类的赋值运算符。explicitBase(inti):m_i{i}{}Base(constBase&other):m_i{other.m_i}Base(Base&&other):Base(0){swap(*this,other);}Base&operator=(Baseother){swap(*this,other);return*this;}friendvoidswap(Base&a,Base&b)noexcept{usingstd::swap;swa

c++ - protected 派生类

#includeusingnamespacestd;classBase{public:Base(){cout当我执行上面的示例程序时,出现以下错误:protected.cpp:在函数“intmain(int,char**)”中:protected.cpp:26:错误:‘Base’是‘Derived’不可访问的基础为什么不能用基指针创建派生对象????所以我可以创建一个派生类的实例,例如DeriveddDerivedd1=newDerived;但是像这样从基类指针创建实例Base*b=newderived会失败。这是因为Derived在派生过程和私有(private)时实际上不是Base

c++ - 奇怪的编译器错误和模板继承

谁能解释一下为什么这段代码:classsafe_bool_base{//13protected:typedefvoid(safe_bool_base::*bool_type)()const;voidthis_type_does_not_support_comparisons()const{}//18safe_bool_base(){}safe_bool_base(constsafe_bool_base&){}safe_bool_base&operator=(constsafe_bool_base&){return*this;}~safe_bool_base(){}};templatec

c++ - 什么时候应该限制派生类中虚函数的可访问性?

考虑以下代码:classBase{public:virtualvoidFoo(){}};classDerived:publicBase{private:voidFoo(){}};voidfunc(){Base*a=newDerived;a->Foo();//fine,callsDerived::Foo()Derived*b=newDerived;//b->Foo();//errorstatic_cast(b)->Foo();//fine,callsDerived::Foo()}关于这个问题,我听到了两种不同的思想流派:保留与基类相同的可访问性,因为用户无论如何都可以使用static_c

c++ - 如何在基于派生类的大小的基构造函数中分配数组?

我有一个类层次结构。基类使用一些可从文件加载(并可在运行时重新加载)的调整参数。每个派生类都可以添加一些额外的参数。我正在寻找一种在基本构造函数中分配大小正确的参数数组的方法,这样我就不必在派生类中取消分配和重新分配。我希望有这样的东西,但它不起作用(参数总是有2个元素):classBase{staticintnParms;virtualintgetNParms(){returnnParms;}float*parameters;public:Base(){parameters=newfloat[this->getNParms()];parameters[0]=globalReloada

c++ - 派生的 C++ 类如何通过基指针克隆自身?

这是我正在尝试做的(这段代码不起作用):classBase{virtualBase*clone(){returnnewBase(this);}virtualvoidID(){printf("BASE");};classDerived:publcBase{virtualBase*clone(){returnnewDerived(this);}virtualvoidID(){printf("DERIVED");}}..Derivedd;Base*bp=&d;Base*bp2=bp->clone();bp2->ID();我喜欢的是看到打印出“DERIVED”...我得到的是“BASE”。我是

c++ - 添加虚拟删除错误 : type 'base' is not a direct base of derived class

考虑以下示例代码:#includeusingnamespacestd;classbase{public:base(){cout这给出了错误:error:type`base'isnotadirectbaseof`derived2'为什么会出现这个错误?如果我将基类设为虚拟,则错误不再存在。这是什么原因? 最佳答案 因为base不是derived2的直接基类。您必须为您的直接基础提供构造函数,在本例中为derived1。虚拟基地除外。它们总是在叶类中初始化,否则您可能会为同一个基类调用多个构造函数。因此,如果您使base成为虚拟的,您不