草庐IT

c++ - 从子类的STL vector 到基类 vector 的转换

我想知道是否可以将派生类值的vector转换为基类值的vector。具体来说,我希望能够将基类对象的vector传递给其形式参数采用基类vector的函数。它似乎不可能直接作为以下代码示例产生错误(使用g++):#includeclassA{};classB:publicA{};voidfunction(std::vectorobjs){}intmain(intargc,char**argv){std::vectorobjs_b;objs_b.push_back(B());function(objs_b);}test.cc:16:error:conversionfrom‘std::ve

C++在派生类中初始化基类的const int?

我的基类中有一个常量int变量,我想在我的派生类中用不同的值(作为参数)初始化响应变量,这可能吗?这是我做的://Base.h(methodsimplementedinBase.cppintheactualcode)classBase{public:Base(constintindex):m_index(index){}intgetIndex()const{returnm_index;}private:constintm_index;};//Derived.hclassDerived:publicBase{public:Derived(constintindex,conststd::s

c++ - 工业级n吨基类模板

我正在研究一个n-ton基类模板。我还不担心懒惰,所以Intent是:Ensureaclasshasonlyninstances,andprovideaglobalpointofaccesstothem.到目前为止,这是我的代码:templateclassn_ton_base//Singletonsarethedefault{staticDerivedinstances[n+(n==0)];//Zerotonsaresupported,tooprotected://Preventn_ton_basetobeusedoutsideofinheritancehierarchiesn_ton

c++ - 通过对基类的引用调用虚函数

当我运行此代码时,它拒绝将适当的消息打印到控制台。使用指针而不是引用似乎可行(->而不是.)。我是OOP的新手,如果您觉得这很荒谬,请原谅我。#includeusingnamespacestd;classinstrument{public:virtualvoidplay(){}};classdrum:publicinstrument{public:voidplay(){cout 最佳答案 instrument&pi=i;在这里,您使pi引用instrument对象i。pi=p;在这里,您将piano对象p分配给pi引用的对象。引用p

c++ - 在 C++ 中,为什么仅包含 union 及其基类实例的派生类占用的内存大于 union 的大小?

更具体地说,一个类继承自一个空类,只包含一个union体,其成员包括基本无数据类的实例,比union体占用更多的内存。为什么会发生这种情况,是否有任何方法可以避免消耗额外的内存?下面的代码说明了我的问题:#includeclassempty_class{};structbig:publicempty_class{union{intdata[3];empty_classa;};};structsmall{union{intdata[3];empty_classa;};};intmain(){std::cout此代码的输出,当使用gcc版本7.3.0编译时使用-std=c++17编译(虽然

c++ - 为什么派生类指针在没有强制转换的情况下不能指向基类对象?

对于这种基本问题here和here,我很少看到“宠物”和“狗”类型的示例,但是它们对我来说没有意义,这就是原因。假设我们具有以下类结构classPet{};classDog:publicPet{};然后下面的语句a(Dog)isa(Pet)在我看来,在现实生活中可能是正确的,但在C++中不是正确的。只需看一下Dog对象的逻辑表示,它看起来像这样:说的比较合适a(Dog)hasa(Pet)或者a(Pet)isasubsetof(Dog)如果您注意到这与“狗是宠物”在逻辑上相反现在的问题是下面的#1被允许,而#2则不允许:Pet*p=newDog;//[1]-allowed!Dog*d=n

c++ - 为所有异常使用一个基类有什么缺点?

我正在做Stroustrup的C++编程语言第4版中的练习。其中一项任务是这样制定的:ConsiderusingaclassExceptionasthebaseofallclassesusedasexceptions.Whatshoulditlooklike?Howshoulditbeused?Whatgoodmightitdo?Whatdisadvantagesmightresultfromarequirementtousesuchaclass?答案看起来很像std::exception,除了缺点部分-我唯一能想到的是__vptr的成本,这通常被认为可以忽略不计.我在这里缺少什么?

c++ - 在 C++11 中,您能否将引用的基类传递给线程的构造函数并获得多态行为?

我观察到VisualStudio11Beta中的新库与使用thread()和ref()的Boost之间的行为差​​异。我想知道谁是对的。如果标准偏离了Boost的原始实现,则两者都可能。(但我不打算尝试破译标准语......)我会用MinGW试一试......唉,据我所知,不适用于MinGW。那么,第一个问题是,gcc和Clang是否表现出相同的编译失败?如果他们不这样做,我将针对VS提交错误。第二个问题可能是,如果编译失败是正确的,我的解决方法是什么来获得Boost给我的东西(除了继续使用Boost)?我想我确实有第三个问题...我正在做的事情是否符合犹太洁食标准?classbase

c++ - 没有对多个基类中的模板化成员函数进行访问或歧义检查

这可以在VisualC++2015Update3RC上正常编译和运行:classA{templatevoidf(){}};classB:A{};classC:A{};classD:B,C{};intmain(){Dd;d.f();}这段代码有两个问题:f()是私有(private)的,所以d.f()应该无法编译。f()是模棱两可的,因为它可能是B::f()或C::f().但是,/Wall没有诊断功能和B::f()叫做。倒序D继承自getsC::f()调用,所以我猜它只是使用列表中的第一个基类。g++和clang都正确。我是否遗漏了什么或者这是VisualC++中的错误?

c++ - 继承二级基类构造函数: silent error

我今天遇到了一个非常严重的错误,这是一个MWE:#includeclassX{public:X(){std::cout与我的预期相反,打印了“Default”。不可否认,代码是错误的,因为Z的继承构造函数试图初始化X而没有指定如何构造Y(∗).但是,编译器不应该提示吗?Y(以及随后的X)的默认构造函数被调用,完全无提示地忽略我的参数3背后的基本原理是什么?这是否记录在标准的某处?还是我的编译器存在错误?我的环境是gccversion6.2.120160916(RedHat6.2.1-2)。即使使用-Weffc++-Wall-Wextra-pedantic也不会产生编译器警告。