草庐IT

Inheritance

全部标签

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++ - 创建一个包含其父类的所有功能的类,除了一个

假设我有两个类(class),一个是:classA{public:voidf1(){cout现在我希望B类包含A的所有功能,f3除外。我正在做的是:classB:publicA{private:voidf3(){}};据我所知,B::f3()隐藏了A::f3()的定义,而B::f3()是私有(private)的,f3()不能通过类B访问。但我仍然可以这样调用它:Bvar();var.A::f3();有什么方法可以在不更改类A的情况下使用继承从类B中完全隐藏f3吗? 最佳答案 不要养成通过继承将类拼凑在一起的习惯,方法是混合和匹配大致

C++:多态类模板

考虑一个存储一堆Date对象的Calendar类。日历旨在保存从Date继承的任何类型的对象的集合。我认为最好的方法是拥有一个类模板,例如templateclassCalendar{...}但令我震惊的是,D现在实际上可以是任何类。我现在的问题是,如何确保D是日期对象的子类?我知道如何在Java中执行此操作,但我仍然不熟悉C++语法。这个问题与某些集合如何只能采用实现Comparable的模板变量非常相似。然后标题看起来像publicclassCalendar{...}--------------------编辑:------------------------------------

c++ - 为什么派生类的大小包括来自基类的私有(private)成员?

我有以下代码:classA{private:inti;};classB:publicA{private:intj;};当我检查sizeof(B)时,它似乎是sizeof(base)+sizeof(derived)。但是,我对继承的理解是,基类的private成员不被继承。为什么它们包含在sizeof(B)的结果中? 最佳答案 所有成员变量都是继承的。privateprotectedpublic修饰符只会改变那些访问这些变量的人 关于c++-为什么派生类的大小包括来自基类的私有(priva

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

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

C++ list<T>::iterator 不能在派生类模板中使用

g++编译器给出了这个错误:expected`;'在“它”之前templateclassmyList:publicstd::list{public:voidfoo(){std::list::iteratorit;//compilererrorasabovementioned,why???}};谢谢。 最佳答案 在g++中。每当在模板中看到错误时:error:expected';'before'it'怀疑你需要一个类型名:typenamestd::list::iteratorit;当您在模板中声明了一个依赖于一个或多个模板参数的新类型

C++删除继承类

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

C++ - 没有合适的默认构造函数可用

这个问题在这里已经有了答案:"Noappropriatedefaultconstructoravailable"--Whyisthedefaultconstructorevencalled?(2个答案)关闭6年前。我在使用一个非常简单的程序时遇到了问题。它抛出错误:错误C2512:“玩家”:没有合适的默认构造函数可用IntelliSense:类“Player”不存在默认构造函数我觉得这与在Game.h中将Player类声明为私有(private)变量有关,但我不明白为什么。任何帮助将不胜感激。游戏.h#pragmaonce#include"Player.h"classGame{publ

c++ - 未调用基本复制构造函数

classBase{public:inti;Base(){cout如果我这样做派生d1;导出d2=d1;调用base的拷贝构造函数,调用derived的默认拷贝构造函数。但是如果我从派生的复制构造函数中删除注释,则不会调用基本复制构造函数。这有什么具体原因吗?提前致谢。 最佳答案 我认为您必须显式调用基本复制构造函数:Derived(Derived&d):Base(d){cout 关于c++-未调用基本复制构造函数,我们在StackOverflow上找到一个类似的问题:

c++ - 为什么 C++ 不允许您请求指向最派生类的指针?

(这个问题应该引用Stroustrup来回答。)能够请求指向最派生类的指针似乎非常有用,如下所示:classBase{...};classDerivedA{...};classDerivedB{...};classProcessor{public:voidDo(Base*b){...}voidDo(DerivedA*d){...}voidDo(DerivedB*d){...}};listthings;Processorp;for(list::iteratori=things.begin(),e=things.end();i!=e;++i){p.Do(CAST_TO_MOST_DERIV