草庐IT

c++ - 访问派生类中类的 protected 成员

我这里有一个旧代码库,他们在其中使用了protected成员变量。可以讨论这是否是一个好主意。但是,代码必须使用gcc3编译得很好。我有一个派生模板类Bar,它像这样使用类模板Foo中的protected成员xtemplateclassFoo{public://stuff...protected:some::typex;}templateBar:Foo{public:voidcleanup();}在cleanup()的方法声明中有一些用x完成的事情templatevoidBar::cleanup(){doSomeThingCleanUpLike(x);}这不适用于gcc4,尽管它应该适

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

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

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

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

c++ - 覆盖派生类中的成员字段

下面是一段代码:#includeusingnamespacestd;classBase{public:Base():b(0){}intget();virtualvoidsayhello(){cout运行编译后的可执行文件,我发现在我的llvm-g++4.2机器上结果超出了我的预期。我盒子上的输出是HellofromDerivedwithb:10Derivedb:0HellofromBasewithb:0Baseb:0我想在代码中做的是覆盖Derived类中的成员字段(b)。由于我觉得Base和Derived都需要访问这个字段,所以我在Base中定义了一个get成员函数,因此Derive

C++:比较基类和派生类的指针

我想要一些关于在这种情况下比较指针时的最佳实践的信息:classBase{};classDerived:publicBase{};Derived*d=newDerived;Base*b=dynamic_cast(d);//WhencomparingthetwopointersshouldIcastthem//tothesametypeordoesitnotevenmatter?booltheSame=b==d;//Or,booltheSame=dynamic_cast(b)==d? 最佳答案 如果你想比较任意类层次结构,安全的做法是

c++ - 将派生类分配给基类

执行以下操作是否安全或者是否是未定义的行为:classBase{private:inta;};classDerived:publicBase{private:intb;};Basex;Derivedy;x=y;//safe?派生类中的额外位是否被切掉了? 最佳答案 是的,切片发生了。不过,这不是未定义的行为。您可能会发现C++-FAQ中的此条目很有帮助:http://www.parashift.com/c++-faq-lite/virtual-functions.html#faq-20.8

c++ - 从派生类初始化列表调用基类构造函数的顺序

structB{intb1,b2;B(int,int);};structD:B{intd1,d2;//whichistechnicallybetter?D(inti,intj,intk,intl):B(i,j),d1(k),d2(l){}//1stBase//orD(inti,intj,intk,intl):d1(k),d2(l),B(i,j){}//lastBase};以上只是伪代码。实际上,我想知道调用基础构造函数的顺序重要吗?是否有任何情况导致的不良行为(尤其是极端情况)?我的问题是关于更多技术方面的问题,不是编码风格。 最佳答案

c++ - std::bind() - 从派生类的成员函数中获取基保护成员函数

我想从派生类bind()到我的基类版本的函数。该功能在基础中被标记为protected。当我这样做时,代码在Clang(AppleLLVM编译器4.1)中编译愉快,但在g++4.7.2和VisualStudio2010中都出现错误。错误如下:“'Base::foo':不能访问protected成员。”这意味着引用的上下文实际上在bind()中,当然函数在其中被视为protected。但是bind()不应该继承调用函数的上下文——在本例中是Derived::foo()——因此将基方法视为可访问的?下面的程序说明了这个问题。structBase{protected:virtualvoidf

c++ std::copy 类型转换为派生类可能吗?

我很确定没有办法明确地做到这一点,但我还是想问一下,以防万一有更好的方法。我有一个基类A和一个派生类B,现在我有一个指向B*的A*std::list,我想将这个A*列表复制到B的std::vector*基本上我想这样做:std::listaList=someObject.getAs();std::vectorbVec=std::vector(aList.begin(),aList.end());我很确定当列表和vector是相同类型时(例如,都是A*的)这应该可以编译,但是因为在这种情况下A*是B*的基类,所以我不能这样做这样,因为我必须像这样显式地进行类型转换:std::listaL

c++ - 每个派生类的静态变量

这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Overridingstaticvariableswhensubclassing我有一组类都派生自一个基类。这些派生类中的任何一个都声明相同的静态变量。但是,它特定于每个派生类。考虑以下代码。classBase{//TODO:somehowdeclarea"virtual"staticvariablehere?boolfoo(inty){returnx>y;//error:‘x’wasnotdeclaredinthisscope}};classA:publicBase{staticintx;};classB: