草庐IT

Inheritance

全部标签

c++ - 我在这里滥用继承吗?什么是最佳实践替代方案/模式?

大编辑因此,在收集了大家的一些反馈并思考了XYproblem之后正如Zack所建议的,我决定添加另一个代码示例来准确说明我要完成的任务(即“X”),而不是询问我的“Y”。现在我们正在处理汽车,我添加了5个抽象类:ICar、ICarFeatures、ICarParts、ICarMaker,ICarFixer。所有这些接口(interface)都将包装或使用第三方库提供的技术特定的复杂对象,具体取决于接口(interface)背后的派生类。这些接口(interface)将智能地管理复杂库对象的生命周期。我的用例是FordCar类。在此示例中,我使用Ford库访问类FordFeatureIm

c++ - 需要一个例子来说明默认构造函数没有被继承

我知道默认构造函数不是继承的,如n3337中所述.还有一个例子:structB2{B2(int=13,int=42);};structD2:B2{usingB2::B2;};很好的解释:ThecandidatesetofinheritedconstructorsinD2forB2is...—B2(int=13,int=42)—B2(int=13)—B2()最重要的是:ThesetofconstructorspresentinD2is—D2(),implicitly-declareddefaultconstructor,notinherited对我来说,这个例子并没有显示出区别,从某种意

c++ - 阻止虚拟继承

在现代C++中是否有一种方法可以防止类被虚拟继承,同时允许常规继承?现在对我来说这似乎是不可能的,但这种语言中有太多似乎不可能的东西。 最佳答案 为继承基指定的virtual关键字的目的是防止它在继承层次结构中多次实例化。所以首先不能阻止使用它(另见'Whatisavirtualbaseclass')。我相信您可能对如何通过继承类来控制实际可以覆盖的内容感到困惑。如果您没有在您的类中声明virtual方法,则继承类无法为来自该基类的任何方法提供任何virtual覆盖。最好首先从语义上说明这一点是classFoo{public:Foo

c++ - 防止派生类强制转换为基类

我有classRect{//stuff};和classSpecialRect:publicRect{private:operatorconstRect(){return*this;}//NoimplicitscaststoRectpublic://stuff};SpecialRect继承了Rect的所有属性和方法,除了我想避免从SpecialRect到基类Rect的非显式转换。在代码中SpecialRectoneSpecial;RectaRect=oneSpecial;//Iwantthistonotcompile.(toremind-metodeclareaRectasSpecial

C++ 重载和覆盖

此代码生成以下编译错误:error:nomatchingfunctionforcallto'C::print(int)'你能帮我弄清楚编译器产生那个错误的过程吗,(为什么它忽略了类B中的函数)#includeusingstd::cout;classA{public:virtualvoidprint(){coutprint(5);} 最佳答案 print的每个后续定义都隐藏了其父级的定义。您需要一个using语句来取消隐藏它:classA{public:virtualvoidprint(){coutDemo您的指针指向C*,而不是B*

C++ 私有(private)继承和静态成员/类型

我试图阻止一个类将它的“this”指针转换成它的接口(interface)之一的指针。我通过中间代理类使用私有(private)继承来做到这一点。问题是我发现私有(private)继承使得层次结构中继承类下的所有类都无法访问基类的所有公共(public)静态成员和类型。classBase{public:enumEnum{value};};classMiddle:privateBase{};classChild:publicMiddle{public:voidMethod(){Base::Enume=Base::value;//doesn'tcompileBAD!Base*base=th

C++通过继承在具有 protected 构造函数的基类堆上分配对象

我有一个带有protected构造函数的类:classB{protected:B(){};};现在我从它派生并定义了两个静态函数,我设法实际创建类B的对象,但不是在堆上:classA:publicB{public:staticBcreateOnStack(){returnB();}//staticB*createOnHeap(){returnnewB;}//CompiletimeErroronVS2010};Bb=A::createOnStack();//ThisworksonVS2010!问题是:1)VS2010允许第一种情况是错误的吗?2)是否可以在不以任何方式修改B的情况下创建B

c++ - C++中的类接口(interface)继承

我有以下情况,图为我的类的理论继承图:基本思路是1)有两个可以在不同平台上实现的抽象基类(在我的例子中是两个不同的操作系统)2)允许BBase向上转换为ABase以便有时能够平等地处理这两种类型(例如,将两种类型的实例保存在一个列表中)。3)在ABase和BBase中实现某些通用功能。现在,用C++表示它的最佳方式是什么?尽管它确实支持多重继承,但据我所知,像这样的多级继承是不可能的。问题是B继承自A和BBase,而后者又继承自ABase。只需将此1:1(以下代码)翻译成C++,C++编译器(GNU)就会提示ABase::foo()未在B中实现。classABase{public:vi

c++ - 是否有可能调用一个父类(super class)的构造函数,两个类远离 C++ 中的当前类

我有三个继承如下的类:Class_AClass_B:publicClass_AClass_C:publicClass_BClass_A包含一个构造函数:public:Class_A(constchar*name,intkind);Class_B不包含该构造函数。在Class_C中,我希望调用Class_A的构造函数。像这样的东西:Class_C(constchar*name,intkind):Class_A::Class_A(name,kind){}问题是我无法向Class_B添加中间构造函数,因为Class_B是生成的代码,每次我makeclean时都会重新生成。所以我无法对Clas

c++ - 如何避免样板代码构造函数?

让我们这样上课:structBase{Base(){...}Base(int){...}Base(int,string){...}...};我想从Base继承很多类,所以我写structSon:publicBase{Son():Base(){}Son(int):Base(int){}Son(int,string):Base(int,string){}};structDaughter:publicBase{Daughter():Base(){}Daughter(int):Base(int){}Daughter(int,string):Base(int,string){}};而且我不需要向