草庐IT

Inheritance

全部标签

c++ - 从 C++ 中的空基类继承

我想创建一个名为“Node”的空基类,然后从中派生其他类,例如“DecisionNode”和“Leaf”。这样做很有意义,因此我可以利用多态性将这些不同类型的节点传递给方法,而无需在编译时知道将传递给方法的内容,但每个派生类都不共享任何状态或方法。我认为最好的实现方法是使构造函数成为纯虚拟的,而无需在基类中创建额外的纯虚拟方法(这会增加困惑)。因此,在该类的头文件“Node.h”中,我写道:classNode{private:virtualNode();};在“Node.cpp”中我写道:#include"Node.h"virtualNode::Node()=0;此实现防止Node被另

c++ - 覆盖子类中的 Qt 插槽

我有一个基类,它定义了一个Qt插槽classBase{public:Base(){connect(otherobject,SIGNAL(mySignal),this,SLOT(mySlot));}publicslots:virtualvoidmySlot(){}}子类A只是实现了一些其他的东西。子类B覆盖插槽classSubB:Base{public:SubB():Base(){//Necessary?connect(otherobject,SIGNAL(mySignal),this,SLOT(mySlot));}publicslots:virtualvoidmySlot()overr

c++ - 非多态继承对性能/内存使用有影响吗?

我很好奇继承对非多态类的影响。具体来说,我正在编写两个智能指针类,都没有使用虚方法,而且都用于非常独特的目的。由于基本运算符重载和一些标准函数是相同的,而且它们只需要一个成员变量,所以我想我可以使用一个基类来重用代码。这是我的意思的简单模型:基类:templateclassPointer_Impl{public:T&operator*(){returnthis->*m_pointer;}//etc.protected:T*m_pointer;//protectedtopreventinstantiationwithoutusing=deletePointer_Impl(){}Point

C++ 继承 : scoping and visibility of members

你能解释一下为什么这是不允许的吗,#includeclassB{private:inta;public:inta;};intmain(){return0;}这是什么时候?#includeclassA{public:inta;};classB:publicA{private:inta;};intmain(){return0;}在这两种情况下,我们在classB中都有一个名为a的公共(public)变量和一个私有(private)变量。现在编辑! 最佳答案 Inboththecases,wehaveonepublicandonepriv

c++ - 强制虚拟方法表中的函数顺序?

如何控制虚拟表中虚拟函数的顺序?它们的排列顺序是否与声明的顺序相同?当继承一个带有虚表的类时,被继承类的虚表是基类的扩展,还是只用继承类的虚函数创建的全新虚表。(即虚拟表是否仍在类的索引+0x0处?) 最佳答案 (a)就标准而言,你不能,(事实上你甚至不能假设vtables存在)。(b)可能吧,但是在什么情况下你需要控制顺序,但是你自己查不到呢?检查的方法是查看虚拟调用的反汇编(并找到添加到vtable指针的偏移量以获得调用地址)或查看vtable本身的反汇编。视情况而定。对于单继承,可能它是基类的扩展,每个对象的索引0指向该类的一

c++ - 基类指针与继承类指针?

假设我有一个继承自Animal类的Dog类。这两行代码有什么区别?Animal*a=newDog();Dog*d=newDog();一种是指向基类的指针,另一种是指向派生类的指针。但这种区别何时会变得重要?对于多态性,两者的工作方式完全相同,对吧? 最佳答案 为了类型检查的所有目的,编译器对待a就好像它可以指向任何动物,即使你知道它指向一只狗:你不能通过a到一个期待Dog*的函数.你做不到a->fetchStick(),其中fetchStick是Dog的成员函数但不是Animal.Dog*d2=dynamic_cast(d)可能只是

C++:需要调用相同代码的虚函数?

我有一个基类和派生自它的类。基类Controllable充当输入循环的接口(interface),其他类从它派生以在该循环中获得一个位置以获取事件,例如按下某个键。classControllable{public:virtualvoidsetActive(boolstate){m_active=state;}virtualvoidinput(Event&e)=0;private:boolm_active;};classButton:publicControllable{public:voidsetActive(boolstate){/*doextrawork*/m_active=sta

c++ - 多重继承和unique_ptr销毁

我有经典的(可能有问题的)多重继承菱形方案。B继承了AC继承了AD继承了C和B我想要一个std::vector可以包含C或D对象,所以我将其设为std::vector这是D爸爸和它工作正常。但是当我使用:std::vector>然后我在破坏vector时出现段错误。**glibcdetected***./a.out:free():invalidpointer:0x0000000009948018***为什么会有差异?对我来说,即使是第一次实现也是有问题的。代码#include#include#includeclassA{public:A()=default;};classB:publi

c++ - 为什么 operator = 不从模板类继承

我有以下模板代码:classClassName{};templateclassTemplatePtr{public:voidoperator=(T*p){}};classTemplatePtr_ClassName:publicTemplateePtr{public:~TempaltePtr_ClassName();};voidTest(){TemplatePtr_ClassNamedata;data=newClassName;}但编译失败并显示错误消息(VS2008):errorC2679:binary'=':nooperatorfoundwhichtakesaright-handop

c++ - 我可以只覆盖继承中的一种方法吗?

我的C++代码如下:#includeusingnamespacestd;classA{public:virtualvoidf(inti){cout在编译期间我得到:g++-std=c++11file.cppfile.cpp:Infunction‘intmain()’:file.cpp:29:9:error:nomatchingfunctionforcallto‘B::f(int,int)’file.cpp:29:9:note:candidateis:file.cpp:20:16:note:virtualvoidB::f(int)file.cpp:20:16:note:candidate