在回答其中一个问题时,出现了一个讨论帖belowmyanswer.这表明根据访问说明符(或者可能是继承类型)private/protected/publicsizeofclass对象可能会有所不同!他们简短的讨论我还是不明白,这怎么可能? 最佳答案 注意下面的C++11新语言在C++03中,有一种语言使这成为可能,9.2[class.mem]/12(强调我的):Nonstaticdatamembersofa(non-union)classdeclaredwithoutaninterveningaccess-specifierarea
以下示例来自《InsideC++objectmodel》一书classAbstract_base{public:virtual~Abstract_base()=0;virtualvoidinterface()const=0;virtualconstchar*mumble()const{return_mumble;}protected:char*_mumble;};作者说如果我想初始化纯虚基类的数据成员_mumble,应该实现一个“protected构造函数”。但为什么要保护?为什么“publicconstructor”不适合这个类?感谢您的回答,如果有例子就完美了。
我这里有一个旧代码库,他们在其中使用了protected成员变量。可以讨论这是否是一个好主意。但是,代码必须使用gcc3编译得很好。我有一个派生模板类Bar,它像这样使用类模板Foo中的protected成员xtemplateclassFoo{public://stuff...protected:some::typex;}templateBar:Foo{public:voidcleanup();}在cleanup()的方法声明中有一些用x完成的事情templatevoidBar::cleanup(){doSomeThingCleanUpLike(x);}这不适用于gcc4,尽管它应该适
在C++FAQ站点中提到——“较大的派生类对象在作为基类对象按值传递时被切片”,切片是什么意思?有什么示例可以演示吗?http://www.parashift.com/c++-faq-lite/value-vs-ref-semantics.html#faq-31.8我正在使用VSTS2008+nativeC++作为我的开发环境。 最佳答案 引用thislecture:SlicingSupposethatclassDisderivedfromclassC.WecanthinkofDasclassCwithsomeextradataan
(在msvc2017上测试)structAAA{virtualfloatrun(intarg){return5.5f;}};structBBB:AAA{virtualboolrun(doublearg){returnfalse;}};structCCC:BBB{virtualfloatrun(intarg){return7.7f;}virtualboolrun(doublearg){returntrue;}};CCCc;BBB*pb=&c;pb->run(5);//callCCC::run(doublearg),WHY??pb->run((int)5);//callCCC::run(d
当使用派生类的对象访问“base”的foo()时。#includeclassbase{public:voidfoo(){std::cout如何访问派生类中具有同名方法的基类方法。已显示生成的错误。如果我不清楚,我深表歉意,但我觉得我已经把自己说得一清二楚了。提前致谢。 最佳答案 您可以将usingbase::foo添加到您的派生类中:classderived:publicbase{public:usingbase::foo;voidfoo(intk){std::cout编辑:thisquestion的答案解释了为什么如果没有usin
与这些问题非常相似,但不完全相同:WhatistheorderinwhichthedestructorsandtheconstructorsarecalledinC++Orderofmemberconstructoranddestructorcalls我想知道:派生类的成员变量是在调用基类的析构函数之前还是之后销毁的?这是在C++中使用VisualStudio2008。谢谢。 最佳答案 构造函数:先基后导出破坏:~派生~成员派生~基地~成员(member)群代码:classmember{strings;public:member(s
我有两个结构:templatestructOdp{Tm_t;Toperator=(constTrhs){returnm_t=rhs;}};structFtw:publicOdp{booloperator==(constFtw&rhs){returnm_t==rhs.m_t;}};我想编译以下内容:intmain(){Odpodp;odp=2;Ftwf;f=2;//C2679:nooperatorcouldbefound}有什么方法可以让它工作,还是我必须在Ftw中也定义运算符? 最佳答案 问题是编译器通常会为你创建一个operato
#includeusingnamespacestd;classX{public:virtualvoidf(){}};classY{public:virtualvoidg(){}};intmain(){X*x=newX();Y*y=dynamic_cast(x);//A//Y*y=static_cast(x);//BcoutA编译而B不编译。我明白为什么B没有被编译但是为什么A被编译虽然X和Y是完全不相关的类型? 最佳答案 这就是为什么dynamic_cast在不相关的类型之间被允许:classX{public:virtualvoid
假设我们有两个类,A和B。当使用组合来建模“has-a”或“is-implemented-in-terms-of”关系时(例如Bhas-aA),与继承相比的缺点之一是B不包含A的公共(public)功能它需要。为了访问A的公共(public)函数,有必要提供转发函数(与继承相反,其中B将继承所有A的公共(public)功能)。举一个更具体的例子,假设我们有一个Person,它有一个ContactInfo:usingnamespacestd;classContactInfo{public:ContactInfo();voidupdateAddress(stringaddress);voi