草庐IT

Inheritance

全部标签

c++ - 继承与聚合以及 "has-a"与 "is-a"。

在我的代码中,我发现使用类似混合的继承来组合具有不同block的对象很有用。我有:className{public:typedefint32_tvalue_type;public://ctorsanddtorsvoidset_value(value_typevalue){value_=value;}constvalue_type&value()const{returnvalue_;}private:value_typevalue_;};classNamedObject{public:voidset_name(constName&name){name_=name;}constName&n

c++ - 添加虚拟删除错误 : type 'base' is not a direct base of derived class

考虑以下示例代码:#includeusingnamespacestd;classbase{public:base(){cout这给出了错误:error:type`base'isnotadirectbaseof`derived2'为什么会出现这个错误?如果我将基类设为虚拟,则错误不再存在。这是什么原因? 最佳答案 因为base不是derived2的直接基类。您必须为您的直接基础提供构造函数,在本例中为derived1。虚拟基地除外。它们总是在叶类中初始化,否则您可能会为同一个基类调用多个构造函数。因此,如果您使base成为虚拟的,您不

c++ - 结构和类以及继承 (c++)

如果struct中的所有访问说明符(包括继承)都是public,你能向我保证吗?换句话说:它们相等吗?classC:publicB,publicA{public:C():A(1),B(2){}//...};和structC:B,A{C():A(1),B(2){}//...}; 最佳答案 是的,它们都是公开的。structA:B{Cc;voidfoo()const{}}相当于structA:publicB{public:Cc;voidfoo()const{}}对于成员,在§11中指定:Membersofaclassdefinedwit

c++ - 使用指向基抽象类的指针访问子类成员

classa//mybaseabstractclass{public:virtualvoidfoo()=0;};classb:publica//mychildclasswithnewmemberobject{public:voidfoo(){}intobj;};intmain(){bbee;a*ptr=&bee;ptr->obj;//ERROR:classahasnomembernamed"obj"}我的问题是,当我有一个指向子类(“b”)对象的基类(“a”)指针时,如何访问“obj”成员?我知道转换应该可以解决问题,但我正在寻找更好的解决方案。 最佳答案

c++ - 派生类中虚函数调用的优化

在派生类中调用虚函数以便编译器可以内联或以其他方式优化调用的最佳方法是什么?例子:classBase{virtualvoidfoo()=0;};classDerived:publicBase{virtualvoidfoo(){...}voidbar(){foo();}};我希望在bar()中对foo()的调用始终调用Derived::foo()。据我了解,调用将导致vtable查找,编译器无法优化它,因为可能有另一个类继承自Derived。我可以显式调用Derived::foo(),但如果Derived中有许多虚函数调用,那会变得冗长。我还感到惊讶的是,我无法在网上找到很多Materi

C++ 动态对象。运行时如何确定对象大小?

我不明白一件事。例如,我声明A类和B类是A的子类:classA{public:inta;}classB:publicA{public:intb;}显然,如果我创建A或B的实例,它们在内存中的大小可以由类型决定。AinstanceA;//sizeofthiswillprobablybethesizeofint(propertya)BinstanceB;//sizeofthiswillprobablybetwicethesizeofint(propertiesaandb)但是如果我创建动态实例然后释放它们呢?A*instanceAPointer=newA();A*instanceBPoin

C++ 多重继承 - 相同的方法名称 - 我可以以某种方式删除其中一个吗?

我在C++11中有这个结构structA{intidA;voidsetId(inti){idA=i;}intgetId(){returnidA;}virtualvoidfoo()=0;};structB{intidB;voidsetId(inti){idB=i;}intgetId(){returnidB;}virtualvoidfoo2()=0;};structAB:publicA,publicB{voidfoo()override{}voidfoo2()override{}};现在在main中我可以这样调用它:AB*ab=newAB();ab->B::setId(10);但我真的不喜

c++ - 继承类 C++

我想这样调用父构造函数:Character::Character(intx,inty,inth,ints,inta,chardir):health(h),strength(s),armor(a),direction(dir){if(direction=='N'){Visual('^',x,y);}elseif(direction=='S'){Visual('v',x,y);}elseif(direction=='W'){Visual('',x,y);}}但它不能很好地工作,因为它调用了父级的默认构造函数,该构造函数是privateclassVisual{private:Visual()

c++ - 访问虚拟派生类的成员/方法

这里的例子没有意义,但这基本上是我用Python编写程序的方式,现在我正在用C++重写它。我仍在努力掌握C++中的多重继承,在这里我需要做的是通过C的实例从main访问A::a_print。下面您将看到我在说什么。这可能吗?#includeusingnamespacestd;classA{public:voida_print(constchar*str){cout这是编译错误。test.cpp:Infunction‘intmain()’:test.cpp:6:error:‘voidA::a_print(constchar*)’isinaccessibletest.cpp:21:erro

c++ - C++ 中的编译时接口(interface)实现检查

我在C++中使用伪接口(interface),即纯抽象类。假设我有三个接口(interface),IFoo、IBar和IQuux。我还有一个Fred类实现了所有这三个:interfaceIFoo{voidfoo(void);}interfaceIBar{voidbar(void);}interfaceIQuux{voidquux(void);}classFred:implementsIFoo,IBar,IQuux{}我想声明一个方法,它接受任何实现IFoo和IBar的对象——例如,Fred就可以。我能想到的唯一编译时方法是定义第三个接口(interface)IFooAndBar来实现这