草庐IT

c++ - 为什么对基类子对象有限制?

3.9/2:Foranyobject(otherthanabase-classsubobject)oftriviallycopyabletypeT,whetherornottheobjectholdsavalidvalueoftypeT,theunderlyingbytes(1.7)makinguptheobjectcanbecopiedintoanarrayofcharorunsignedchar.3.9/3:ForanytriviallycopyabletypeT,iftwopointerstoTpointtodistinctTobjectsobj1andobj2,wherenei

c++ - 为什么基类的大小可以为零?

基本上它是thisquestion的跟进..当我查看标准文档时,我发现了这一点..在9.3课中,Completeobjectsandmembersubobjectsofclasstypeshallhavenonzerosize.96)...是的,没错..但是,96)Baseclasssubobjectsarenotsoconstrained.所以,当我查看Stroustrup'sFAQ时,有一个例子voidf(X*p){void*p1=p;void*p2=&p->a;if(p1==p2)cout我的问题是我无法理解这是一种优化,也无法理解为什么允许基类的大小为零?

c++ - 有没有办法在 C++ 基类中创建 "virtual"变量?

我有一个带有指针的基类,需要在所有子类的构造函数中专门对其进行初始化。我怎样才能确保这个变量在子类的构造函数中被初始化?我基本上想要与制作纯虚函数相同的功能,除了指向对象的指针。有办法吗?我的代码看起来像这样:A.hpp:classA{protected:A();X*pointer;};B.hpp:classB:publicA{public:B();};B.cpp:B::B():A(){//howdoimakesurepointergetsinitializedhere?}有什么办法可以实现吗? 最佳答案 改rebase类的构造函数

c++ - 如何设计一个基类,使其在运行时知道所有 "derived"类?

通常,如果您事先知道要创建的所有类型,就可以这样做:typedefenum{BASE_CREATURE_TYPE=0,ANIMAL_CREATURE_TYPE,...}CREATURE_TYPES但这变得很乏味,因为每次创建新类时,都需要更新枚举。此外,CREATURE_TYPES仍然只是枚举中的项目-如何绑定(bind)到实际类?我想知道是否有某种方法,我可以只编写类,并在运行时创建一个包含所有类型的集合,而无需实际实例化对象。这在C++中可行吗?在Java中有一种叫做“静态block”的东西,它在JVM加载类时执行。编辑:这个问题与静态block无关——这只是一个例子——我想知道是

c++ - 将默认构造函数添加到基类会更改派生类型的 sizeof()

这个问题在这里已经有了答案:Whenextendingapaddedstruct,whycan'textrafieldsbeplacedinthetailpadding?(4个答案)关闭4年前。我倾向于认为我对C++内部结构和内存布局有很好的掌握,但这个让我感到困惑。我有以下测试代码:#includestructFoo{//Foo(){}intx;chary;};structBar:publicFoo{charz[3];};intmain(){printf("Foo:%uBar:%u\n",(unsigned)sizeof(Foo),(unsigned)sizeof(Bar));}输出

c++ - decltype() 可变模板基类

我在期待decltype()的地方有以下代码不工作Derived上课得到run()基类方法返回类型,因为基类没有默认构造函数。classBase{public:intrun(){return1;}protected:Base(int){}};structDerived:Base{templateDerived(Args...args):Base{args...}{}};intmain(){decltype(Derived{}.run())v{10};//itworks.Notexpectedsince//Derivedshouldnothavedefaultconstructorstd

c++ - 如何从派生类访问基类中的 protected 方法?

下面是一段令我恼火的代码示例:classBase{protected:virtualvoidfoo()=0;};classDerived:publicBase{private:Base*b;/*Initializedbyconstructor,notshownhereIntendedtostoreapointeronaninstanceofanyderivedclassofBase*/protected:virtualvoidfoo(){/*Someimplementation*/};virtualvoidfoo2(){this->b->foo();/*Compilatorsetsan

c++ - 我应该在基类中声明所有函数为虚函数吗?

当我声明一个基类时,我应该将其中的所有函数都声明为虚函数,还是应该有一组虚函数和一组我确定不会被继承的非虚函数? 最佳答案 一个函数只需要是虚函数当且仅当派生类将以不同的方式实现该函数。例如:classBase{public:voidsetI(inti)//Noneedforittobevirtual{m_i=i;}virtual~Base(){}//AlmostalwaysagoodideavirtualboolisDerived1()//Isoverridden-somakeitvirtual{returnfalse;}priv

c++ - 使用具有同名方法的派生类的对象访问基类的方法

当使用派生类的对象访问“base”的foo()时。#includeclassbase{public:voidfoo(){std::cout如何访问派生类中具有同名方法的基类方法。已显示生成的错误。如果我不清楚,我深表歉意,但我觉得我已经把自己说得一清二楚了。提前致谢。 最佳答案 您可以将usingbase::foo添加到您的派生类中:classderived:publicbase{public:usingbase::foo;voidfoo(intk){std::cout编辑:thisquestion的答案解释了为什么如果没有usin

c++ - 从子类的构造函数体调用基类的构造函数

我的印象是这是不可能的,例如:CallingtheconstructorofthebaseclassaftersomeotherinstructionsinC++但是下面的程序运行并产生了两行“ConstructorPerson”:#includeclassPerson{public:Person(){std::cout第一个是默认构造函数的隐式调用,很清楚。第二个怎么样-这是否意味着标题中描述的行为是合法的?我使用VisualC++2010。 最佳答案 子类构造函数内部的调用不是调用基类构造函数,它是创建一个临时的、未命名的、类型