草庐IT

继承权

全部标签

c++ - 为什么不继承 C++ 构造函数?

为什么在此代码中需要Child传递构造函数?我认为它不会,但是当我删除它时编译器(gcc和VS2010)会提示。有优雅的解决方法吗?必须将此垫片插入子类似乎毫无意义。classParent{public:Parent(inti){}};classChild:publicParent{public:Child(inti):Parent(i){}};intmain(){Childchild(4);return0;} 最佳答案 因为以下是完全有效的:classParent{public:Parent(inti){}};classChild

c++ - 用于遍历继承层次结构的 Static_cast 与 dynamic_cast

我看到一本关于C++的书提到使用静态转换在继承层次结构中导航比使用动态转换更有效。例子:#include#includeusingnamespacestd;classShape{public:virtual~Shape(){};};classCircle:publicShape{};classSquare:publicShape{};classOther{};intmain(){Circlec;Shape*s=&c;//Upcast:normalandOK//Moreexplicitbutunnecessary:s=static_cast(&c);//(Sinceupcastingis

c++ - 如果一个类可以被继承,那么每个函数都应该是虚拟的吗?

在C++中,编码人员不知道其他编码人员是否会继承他的类。他应该让那个类中的每个函数都虚拟吗?有什么缺点吗?还是根本无法接受? 最佳答案 在C++中,只有当您打算以多态方式使用某个类时,才应使该类可继承。在C++中处理多态对象的方式与处理其他对象的方式非常不同。您不倾向于将多态类放在堆栈上,或者按值传递它们或从函数返回它们,因为这会导致切片。多态对象往往是堆分配的,通​​过指针或引用等传递和返回。如果你把一个类设计成不能被继承,然后再继承它,就会导致各种各样的问题。如果析构函数未标记为虚拟,则无法在不导致未定义行为的情况下通过基类指针

c++ - 修复 C++ 多重继承不明确调用

我有三个结构如下的类:#includeusingnamespacestd;classKeyword{public:virtualfloatGetValue()=0;};classCharacterKeyword:publicKeyword{public:virtualfloatGetValue(){return_value;}private:float_value;};classMeasurementKeyword:publicKeyword{public:virtualfloatGetValue(){return_value;}private:float_value;};classA

c++ - 我们在A(派生类) "is a"B(基类)时使用继承。当A "can be"B或C时我们怎么办?

抱歉提出这个丑陋的问题,但我不知道该如何表达。我将举例说明我的意思:人类可以是法师也可以是战士,所以法师和战士可以继承人类。但是,如果Orc也可以兼而有之呢?我们不能说“人是战士”或“战士是人”。Orc和Human(或者一个父类,Humanoid)是否继承了所有的技能,然后选择使用什么?我不知道是否应该标记特定语言,因为这是关于oop的一般性问题,但由于不同的语言对同一问题可能有不同的方法,所以我更喜欢从C++的角度来回答。 最佳答案 改进您的建模抽象类种族,具体类人类、兽人等...抽象类Class,具体类Mage、Warrior等

c++ - 虚拟继承不会破坏静态组合?

过去5年我一直在假设虚拟继承打破了静态组合。但现在我发现,静态组合仍然存在,只是关于正确实例位置的附加信息。这样对吗? 最佳答案 非虚拟继承中的数据布局:classPoint2d{intx_,y_;};classPoint3d:publicPoint2d{intz_;};点2d:+--------------+|intx_|+--------------+|inty_|+--------------+Point3d:+--------------+--+|intx_||+--------------++--Point2dsubobj

C++删除继承类

假设有一个类Object,然后是另一个继承了Object的类Cat。接下来,有一个Object*(指针)列表。然后,我创建了一个新的Cat并将其放入列表中。一段时间后,我想删除所有Cats并对列表的每个成员调用delete。它会调用Cat的析构函数吗? 最佳答案 是的,如果您将对象的析构函数标记为虚拟的。classObject{public:virtual~Object(){}//makethebaseclassdestructorvirtual};classcat:publicObject{public:virtual~cat()

c++ - 构造函数不适用于从 std::string 继承的类

做的时候#includeclassMyString:publicstd::string{public:MyString(){}};但是下面的用法:MyStrings="Happyday";MyStrings("HappyDay");MyStrings=(MyString)"Happyday";它们都不起作用。似乎与构造函数/运算符声明/覆盖有关,但谁能帮忙指出我在哪里可以找到这些资源?谢谢。 最佳答案 std::string不是为继承而设计的。它没有任何虚函数(甚至没有析构函数!),因此您不能覆盖任何东西。它也没有protected

c++ - 多重虚拟继承中的虚拟表和内存布局

考虑以下层次结构:structA{inta;A(){f(0);}A(inti){f(i);}virtualvoidf(inti){coutC实例的确切内存布局是什么?它包含多少个vptr,每个vptr的确切位置?哪些虚表与C的虚表共享?每个虚拟表到底包含什么?这里是我对布局的理解:----------------------------------------------------------------|vptr1|AptrOfB1|b1|B2ptr|c|vptr2|AptrOfB2|b2|a|--------------------------------------------

c++ - 为什么具有相同名称但不同签名的多重继承函数不被视为重载函数?

以下代码片段在编译过程中产生了“对foo的模糊调用”错误,我想知道是否有任何方法可以在不完全限定对foo的调用的情况下解决此问题:#includestructBase1{voidfoo(int){}};structBase2{voidfoo(float){}};structDerived:publicBase1,publicBase2{};intmain(){Derivedd;d.foo(5);std::cin.get();return0;}所以,问题如题。想法?我的意思是,以下操作完美无缺:#includestructBase{voidfoo(int){}};structDerive