草庐IT

继承权

全部标签

c++ - 将 shared_ptr 与多继承类一起使用

我有一个类继承了两个接口(interface):classMulti:publicIFoo,publicIBar{public:virtual~Multi();//FoopartvirtualvoidfooMethod();//...//BarpartvirtualvoidbarMethod();//...};不幸的是,这个类不能分解为每个接口(interface)的两个单独的类。事实上,在类实现中,这些实体(Foo和Bar)是紧密耦合的,但将来它们可能会分开。另一个类想要使用Multi类,有一个指向IFoo和IBar的指针:classClientClass{public:Client

c++ - 指向具有 protected 继承的基类方法的指针

我有这个代码:classFoo{public:intx=4;int&operator[](size_tindex){returnx;}};classBar:protectedFoo{public:usingFoo::operator[];Bar(){x++;}};intmain(intagrc,char**argv){typedefint&(Bar::*getOp)(size_tindex);Barb;autobVal=b[4];getOpo=&Bar::operator[];autobVal2=(b.*o)(7);}但是,我不能编译它,因为errorC2247:'Foo'notacc

c++ - 类的对象(使用单/多继承)有多少个 vptr?

一个对象通常需要多少个vptr,其clas(child)具有单一继承,基类多重继承base1和base2。识别一个对象有多少个vptr的策略是什么,它具有一对单继承和多继承。虽然标准没有具体说明vptrs但我只想知道一个实现是如何实现虚函数的。 最佳答案 你为什么关心?简单的答案是足够,但我猜你想要更完整的东西。这不是标准的一部分,所以任何实现都可以随心所欲,但一般的经验法则是,在使用虚拟表指针的实现中,作为第零近似值,用于您需要的动态调度至多指向虚拟表的指针与向层次结构中添加新虚拟方法的类一样多。(在某些情况下,可以扩展虚拟表,基

c++ - 什么时候虚拟继承是个好主意?

我正在制作一个游戏GUIAPI,其中每个小部件都继承自Widget类。我在想,当其他人在那里制作自己的小部件时,他们可能对基类不完全满意。例如,他们可能想添加getTheme()。让我所有的小部件都从Widget虚拟继承是不是一个好主意,以便这成为可能?谢谢 最佳答案 仅仅因为用户将自己的方法添加到子类并不意味着您需要使用虚拟继承。如果在您的库中,您有一个具有多个子类的基类,并且人们可以一次从多个子类继承(例如混合而不是替换),您将使用它。 关于c++-什么时候虚拟继承是个好主意?,我们

c++ - 基类的多重虚继承和构造函数调用

有这段代码:#includeclassBazowa{intx;public:Bazowa():x(55){}Bazowa(intx_):x(x_){}voidfun(){std::cout执行此程序后,它将打印“55fun”。类Pochodna1和Pochodna2中的构造函数调用发生了什么——它们被忽略了吗?为什么Bazowa类的成员'x'设置为'55',而不是'101'或'103'? 最佳答案 虚基构造函数总是从最终叶类中调用。没有调用虚拟基的其他构造函数。在您的情况下,SuperPochodna()正在调用Bazowa()并在

涉及私有(private)继承的 C++ 编译器错误

有人可以向我解释以下编译器错误吗:structB{};templatestructA:privateT{};structC:publicA{C(A);//ERRORHERE};指定行的错误是:test.cpp:2:1:error:'structBB::B'isinaccessibletest.cpp:12:7:error:withinthiscontext究竟什么是不可访问的,为什么? 最佳答案 尝试A或A.内部C,对B的不合格引用将获取所谓的injected-class-name,它是通过基类引入的A.自A私有(private)继

c++ - 在哪些情况下我们需要保护继承?

public和private继承都说清楚了,但是protected呢?任何我们真正需要使用它并且它给我们带来好处的例子? 最佳答案 Protectedinheritanceissomethingwhosemeaningeludesmetothisday.这是ScottMeyers关于protected继承的意见(EffectiveC++,第3版):)。但是,这个页面很有趣:EffectiveC++:discouragingprotectedinheritance?. 关于c++-在哪些情

C++:继承同名的重载非虚方法和虚方法会导致问题

我试图将两个具有不同参数列表的同名方法继承到派生类。其中一个是虚拟的并在派生类中被重写,另一个是非虚​​拟的。这样做,我在尝试从派生类对象访问基类的非虚拟方法时遇到编译错误。这是代码片段classBase{public:voidf(){cout产生以下编译错误:error:nomatchingfunctionforcallto‘Deriv::f()’note:candidatesare:virtualvoidDeriv::f(int)我不是C++专家,但直到现在我认为成员方法可以通过其签名完全区分的假设是正确的。因此,不应重写非虚拟方法Base::f()并且应保持可访问性。我错了吗?这

c++ - sizeof(*this) 和结构继承

假设我有一个如下所示的结构:structParentStruct{virtualvoidXYZ(){getSize(sizeof(*this));}intmemberX;}还有另一个继承父结构的struct:structChildStruct:publicParentStruct{intmemberY;intmemberZ;}假设sizeof(int)==4,是否可以将12的值传递给函数getSize()从子结构调用(我目前得到的值是4)?我宁愿不必覆盖所有子结构中的XYZ(),因为我会有很多子结构。 最佳答案 正如其他人所说,th

c++ - qobject 基础的多重继承

代码示例:classTestOne:publicQWidget//TofixthisineedtomodifyclassQWidget:publicvirtualQObject{};whichbelongstoqt{//...};classTestTwo:publicvirtualQObject{//...};classTest:publicTestOne,publicTestTwo{//...};还有什么其他方法可以解决这个问题? 最佳答案 QObject不是为多重继承而设计的。QObject不支持从另一个QObjects多重继承