草庐IT

polymorphism

全部标签

c++ - C++ 子函数中的纯虚函数和未使用的参数

我有以下内容:classParent{public:virtualboolfoo(vectorarg1,vectorarg2)=0;};classChild:publicParent{public:boolfoo(vectorarg1,vectorarg2);};//arg1andarg2notused-GIVESWARNINGboolChild::foo(vectorarg1,vectorarg2){returnfalse;}没有foo(...)的Parent实现,因为它是一个纯虚函数。parent说foo有两个vector参数。child使用两个字符串参数正确地实现了它,但没有使用

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

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

c++ 多态性 ((X*)y)->foo() vs ((X)*y).foo()

假设Y是类X的派生类,并且X声明foo是虚拟的。假设y是类型(Y*)。然后((X*)y)->foo()将执行Y版本的foo(),但((X)*y).foo()将执行X版本。你能告诉我为什么多态性不适用于取消引用的情况吗?我希望这两种语法都能产生Y版本的foo()。 最佳答案 您正在切片Y对象部分并将该对象复制到X对象中。然后调用的函数是在X对象上调用的,因此调用了X的函数。当您在声明或强制转换中指定C++中的类型时,这意味着声明或强制转换为的对象实际上是该类型,而不是派生类型。如果您只想将对象视为X类型(也就是说,如果您希望表达式的静

c++ - C++ 对象引用的行为

考虑以下代码段:classWindow//BaseclassforC++virtualfunctionexample{public:virtualvoidCreate()//virtualfunctionforC++virtualfunctionexample{coutaRef和bRef都分配了*button,但为什么这两个输出不同。赋值给引用类型和非引用类型有什么区别? 最佳答案 你遇到了切片问题。WindowbRef=*button;这里bRef不是引用而是对象。当您将派生类型分配给bRef时,您将派生部分切掉,只剩下一个从Co

C++:多态类模板

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

C++11 和多态 lambda 的缺失——为什么?

我一直在审阅C++11的草稿版本标准。特别是关于lambdas的部分,我对不引入多态lambda的原因感到困惑。例如,在可以使用多态lambda的100001种方式中,我曾希望我们可以使用如下代码:templatevoidfoo(Containerc){for_each(c.begin(),c.end(),[](T&t){++t;});}原因是什么:是委员会没时间了吗?多态lambda太难实现了?或者可能是PTB不需要它们?注意:请记住上面的例子不是唯一的例子,它只是作为代码类型的指南提供的。仅专注于为上述代码提供解决方法的答案将被视为无效!相关资源:Lambdaexpressions

c++ - 虚继承与多态 : Is the cereal library messing with object layout?

我有四个类(A、B、C和D)遵循经典菱形图案和Container包含unique_ptr的类.我想使用cereal序列化这些类序列化库。structA{intf1;intf2;intf3}structB:publicvirtualA{templateinlinevoidsave(Archive&ar)const{std::cerrf1)f2)f3)f1f2f3CEREAL_REGISTER_TYPE(B);CEREAL_REGISTER_TYPE(C);CEREAL_REGISTER_TYPE(D);structContainer{std::unique_ptrobj;template

c++ - 在ctors中调用其他类的虚方法

在关于callingvirtualmethodsinctorsanddtors的问题中,以下一段源代码引用自C++标准:structV{virtualvoidf();virtualvoidg();};structA:virtualV{virtualvoidf();};structB:virtualV{virtualvoidg();B(V*,A*);};structD:A,B{virtualvoidf();virtualvoidg();D():B((A*)this,this){}};B::B(V*v,A*a){f();//callsV::f,notA::fg();//callsB::g,

c++ - 具有写时复制的多态类的 QList?

我正在尝试创建一个仍然使用Qt的implicitsharing的多态类型的QList。.我的具体用例是将QList中的项目传递给QtConcurrent::mapped.这些项目都来自一个基类,该基类定义了一个QtConcurrent::mapped将调用的虚函数。大多数存储的数据将是特定于子类的。这些项目可以在线程开始后进行编辑,给我留下两个主要选项,锁定或复制数据。我不想锁定,因为这会消除使用额外线程的大部分目的。另外,制作我的数据的完整拷贝似乎也很不可取。相反,我想使用Qt的隐式共享来只复制我更改的数据项,但是我似乎无法制作仍然使用隐式共享的多态类型的QList。QListbyd

c++ - 通过指向派生类函数的指针调用基虚方法

我需要通过指针从派生类调用基方法A::foo()。#includestructA{virtualvoidfoo(){std::cout*f)();}};intmain(){B*p=newB();p->callBase(&A::foo);}这段代码输出“B::foo”。是否可以通过指向方法的指针调用A::foo()? 最佳答案 好吧,您可以使用一些技巧来覆盖this的值来做类似的事情。不过,您可能永远不应该尝试这样做,vtable指针并不意味着可以手动修改。要执行您描述的操作,我们需要有指向A的vtable的指针。我们的对象p只有指向