草庐IT

Inheritance

全部标签

c++ - 为什么通过公开继承另一个类来构建一个类是一种糟糕的做法?

我正在为我的OOP期末学习,遇到了一个让我有点难过的问题。问题是“解释为什么通过公开继承List类来构建Stack类是一种糟糕的方法。描述一个更好的解决方案。”我不确定我的回答是否正确,但是否因为“公开继承...”?并且最好改为私有(private)继承,这样除了Stack之外没有其他类知道继承? 最佳答案 如果派生类公开继承自基类,则派生类是基类的一个实例,可能具有一些额外的功能或重写的功能。在堆栈和列表的情况下,堆栈不是列表-它在逻辑上不执行列表操作,如搜索、连接、反转等-因此从列表继承不是一个好主意。您可以在这里使用私有(pr

C++ 覆盖继承的方法

我有以下两个类。由于Child继承自Father,我认为Child::init()覆盖了Father::init().为什么,当我运行程序时,我得到的是“我是父亲”而不是“我是child”?如何执行Child::init()?您可以在这里进行测试:https://ideone.com/6jFCRm#includeusingnamespacestd;classFather{public:voidstart(){this->init();};voidinit(){cout 最佳答案 目前Child::init正在隐藏Father::in

c++ - 与 C++ 中的 virtual 关键字混淆

我正在研究C++中virtual关键字的效果,我想出了这段代码。#includeusingnamespacestd;classA{public:virtualvoidshow(){coutshow();ac->show();bc->show();}预期的输出是:BCB因为B中的show函数是非虚拟的。但是编译时的结果是:BCC它的行为就好像B中的show函数是虚拟的。为什么会这样?B类在这里被覆盖了吗?如果我将C类指向B类,我怎么会指向A类? 最佳答案 根据C++2017标准(10.1.2函数说明符)2Thevirtualspeci

C++基于变量向下转换为派生类

假设我有一个基类“Shape”和派生类“Triangle”、“Square”和“Circle”。“Shape”的成员是一个int“shapeType”。如果shapeType==1,则为三角形。如果shapeType==2,那么它就是一个正方形。如果shapeType==3,则为圆形。如果有一种方法可以通过使用shapeType值“动态”向下转换为正确的派生类,我很想知道我只有一个曾经是派生对象的“Shape”对象。我知道我可以写一个硬编码的switch语句,大致如下:Triangle*t;Square*s;Circle*c;switch(shape->shapeType){case1

c++ - 使用 googletest 测试 protected 成员

我对谷歌测试时的继承感到困惑。我有一个具有protected属性的A类。如果我想访问那些我必须扩展那个类,但同时我还需要扩展public::testing::Test用于gtest的唯一目的.这个问题最优雅的解决方案是什么?我也试图避免#defineprotectedpublic 最佳答案 为避免在被测类中留下测试痕迹,请使用夹具的多重继承:classToBeTested{protected:boolSensitiveInternal(intp1,intp2);//Stillneedstesting}//Google-test:cl

c++ - 派生类的复制构造函数

我有一个基类classKeyframebase{private:std::stringstdstrName;floattime;KeyframeTypekeyframeType;public:Keyframebase();Keyframebase(KeyframeTypekeyType);Keyframebase(constKeyframebase&key);Keyframebase&operator=(constKeyframebase&key);std::stringgetName();};由另一个类派生。classSumKeyframeXYZ:publicKeyframebase

c++ - 在派生对象到基类的 "this"指针上使用 static_cast 的问题

这是取自EffectiveC++3ed的一个例子,它说如果这样使用static_cast,对象的基础部分被复制,并且调用从该部分调用。我想了解幕后发生的事情,有人会帮忙吗?classWindow{//baseclasspublic:virtualvoidonResize(){}//baseonResizeimpl};classSpecialWindow:publicWindow{//derivedclasspublic:virtualvoidonResize(){//derivedonResizeimpl;static_cast(*this).onResize();//cast*thi

c++ - 复制构造继承

structA{virtualvoidwhat(){cout为什么不是b2.m=50?我正在尝试复制一个b对象,并且我有复制构造函数B(constA&x):m(50)。我是否需要为派生类ass复制一个c'tor?像B(constB&x)??我认为既然b对象有一部分,我们可以使用B(constA&x):m(50)而不是默认构造函数::S​​如果你有一个带有A对象参数的函数,你可以传入一个B对象。它与复制构造函数有何不同? 最佳答案 原因是B(constA&x)不是复制构造函数—T类型的复制构造函数必须始终采用对T的左值引用作为第一个(

c++ - 为什么需要重新声明接口(interface)?

我有一个抽象基类,想在派生类中实现一个函数。为什么我必须在派生类中再次声明函数?classbase{public:virtualintfoo(int)const=0;};classderived:publicbase{public:intfoo(int)const;//Whyisthisrequired?};intderived::foo(intval)const{return2*val;} 最佳答案 考虑派生类定义可能在header中,而其实现可能在源文件中。header通常包含在多个位置(“翻译单元”),每个位置都将独立编译。如

c++ - 类和接口(interface)之间的继承顺序重要吗?

先继承class还是先继承C++interface会有什么不同吗?例子:classA:publicIAbstract,publicClassB{};classA:publicClassB,publicIAbstract{}; 最佳答案 initializationorder直接基类(即ClassB和IAbstract)将不同。由基类说明符列表中的声明顺序决定。(强调我的)2)Then,directbaseclassesareinitializedinleft-to-rightorderastheyappearinthisclass'