草庐IT

Inheritance

全部标签

c++ - 具有平凡构造函数的派生类的统一初始化

我正在尝试使用C++11统一初始化解决一些极端情况,但我无法弄清楚这是为什么:structBase{intx,y,z;};structDerived:Base{};static_assert(std::is_trivial::value,"Basemustbetrivial");static_assert(std::is_trivial::value,"Derivedmustbetrivial");Baseb{1,2,3};//1)ThiscompilesfineDerivedd{10,20,30};//2)Thisfails标记为2的行因clang3.1和g++4.7均出现“没有匹配

C++覆盖/重载问题

我在C++中遇到问题:#includeclassA{protected:voidsome_func(constunsignedint¶m1){std::coutsome_func(21,"somechar*");return0;}我正在使用g++4.0.1和编译错误:$g++-W-Wall-Werrortest.cctest.cc:Inmemberfunction‘virtualvoidB::some_func(constunsignedint&,constchar*)’:test.cc:24:error:nomatchingfunctionforcallto‘B::some_

c++ - 隐藏私有(private)重载虚函数?

我有一个大致如下工作的类层次结构:classA{protected:virtualvoidf(int)=0;};classB{protected:virtualvoidf(char*)=0;};classDA:A{private:virtualvoidf(int)override{}};classDB:publicDA,B{private:virtualvoidf(char*)override{}};当我尝试使用clang(或gcc,就此而言)进行编译时,它会发出警告:22:18:warning:'DB::f'hidesoverloadedvirtualfunction[-Woverl

c++ - 虚拟继承和静态继承——C++中的混合

如果你有这样的事情:#includetemplateclassA{public:voidfunc(){T::func();}};classB:publicA{public:virtualvoidfunc(){std::coutfunc()是动态调度的吗?您如何实现类A,以便在B具有虚拟重写时动态分派(dispatch)它,但如果B没有,则静态分派(dispatch)?编辑:我的代码没有编译?对不起大家。我现在有点不舒服。我的新代码也无法编译,但这是问题的一部分。另外,这个问题是给我的,不是常见问题解答。#includetemplateclassA{public:voidfunc(){T

c++ - 为什么 C++ 允许对公共(public)继承基方法进行访问限制?

关于问题“Howtopubliclyinheritfromabaseclassbutmakesomeofpublicmethodsfromthebaseclassprivateinthederivedclass?”,我有一个后续问题:我能理解C++标准允许派生类放宽继承方法的访问限制,但我想不出任何合法的用例,在其中强加访问限制是有意义的派生类。以我对继承概念的理解,如果类Derived是publicclassBase,那么你能用Base做的任何事情用Derived也能做。如果不想让Derived实现Base的接口(interface),那么一开始就不应该使用(公共(public))继

c++ - 通过继承减少模板膨胀

有没有人有通过继承减少模板代码膨胀的经验?我对以这种方式重写我们的容器犹豫不决:classvectorBase{public:intsize();voidclear();intm_size;void*m_rawData;//....};templateclassvector:publicvectorBase{voidpush_back(constT&);//...};我应该在减少编译时间的同时保持最佳性能。我也想知道为什么标准库实现不使用这种方法。 最佳答案 如果您不知道存储的元素是什么类型,那么对vector的操作只有很少的一部分

c++ - 当你是 friend 时,为什么 GCC 不允许从私有(private)嵌套类继承?

问同样的问题:为什么GCC允许从私有(private)嵌套类继承?对于非模板类,它允许从私有(private)嵌套类继承,如果它是一个friend,但不是模板类。是错误吗?templateclassInheritFromBaseMember:publicBase::MemberPrivate//error{usingPrivateMember=typenameBase::MemberPrivate;//worksfine};classMyBase{friendclassInheritFromBaseMember;//anothertrytodeclareitfriendtemplate

c++ - 抽象类作为接口(interface),没有 vtable

我想创建一个抽象类来定义类的一些方法。其中一些应该由基类(Base)实现,一些应该在Base中定义但被Derived覆盖,还有一些应该在Base中是纯虚拟的以强制在Derived中定义。这当然是抽象类的用途。但是,我的应用程序只会直接使用Derived对象。因此,编译器应该在编译时准确地知道要使用哪些方法。现在,因为这段代码将在RAM非常有限的微Controller上运行,所以我很想避免实际使用带有vtable的虚拟类。从我的测试来看,编译器似乎足够聪明,除非必须,否则至少在某些情况下不会创建vtable。然而,有人告诉我永远不要相信编译器:是否有可能将其作为编译的必要条件?下面是一些

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++ 类访问级别

假设我有两个类(class)。一个叫做点:classPoint{public:Point():x_(0),y_(0){}protected:intx_,y_;};然后我有另一个类,它派生自Point:classPoint3D:publicPoint{public:Point3D():Point(),z_(0){}doubledistance(Point3Dpt,Pointbase)const;protected:intz_;};doublePoint3D::distance(Point3Dpt,Pointbase)const{intdist_x,dist_y;dist_x=base.x