我们可以使用多态(继承+虚函数)来泛化不同的类型在一个共同的基类型下,然后引用不同的对象,就好像它们是相同的类型一样。使用dynamic_cast似乎是完全相反的方法,因为本质上我们在决定要采取什么操作之前检查对象的特定类型。是否有任何已知的例子说明某些东西不能像使用dynamic_cast那样容易地使用传统多态性来实现? 最佳答案 每当您发现自己想要基类中的成员函数(如“IsConcreteX”)时(编辑:或者更准确地说,是像“ConcreteX*GetConcreteX”这样的函数),您基本上是在实现自己的dynamic_cas
背景信息我已经使用Java编程一段时间了,几个月前我才切换到C++,所以如果我错过了一些愚蠢的答案,我深表歉意!说了这么多,是时候解决手头的问题了!我正在开发一个基本的基于文本的游戏引擎,我最近遇到了一个有趣的特定且不太可能出现的问题。我尝试在下面的程序中以较小的规模对其进行测试,并决定只显示它(而不是我的实际游戏代码),以免阻塞屏幕,并使问题不那么复杂。下面建模的问题反射(reflect)了我的实际代码的问题,只是没有蓬松的干扰因素。问题本质上,问题是多态性问题之一。我想重载输出运算符“[示例]代码#include#include#includeusingnamespacestd
在我的代码中,我只是注意到我经常需要检查nullptr,即使nullptr不应该是可能的(根据指定的要求)。但是,nullptr可能仍然会发生,因为其他人可能会发送一个nullptr并认为这是可以的(不幸的是不是每个人都读/写规范),并且除非在测试期间在运行时触发问题(并且高测试覆盖率很昂贵)。因此,它可能会导致客户报告很多发布后的错误。例如classdata{virtualvoidfoo()=0;};classdata_a:publicdata{public:virtualvoidfoo(){}};classdata_b:publicdata{public:virtualvoidfo
抱歉,标题太复杂了。我有这样的东西:classBase{public:intSomeMember;Base():SomeMember(42){}virtualintGet(){returnSomeMember;}};classChildA:publicBase{public:virtualintGet(){returnSomeMember*2;}};classChildB:publicBase{public:virtualintGet(){returnSomeMember/2;}};classChildC:publicBase{public:virtualintGet(){return
我的程序需要处理不同种类的“笔记”:NoteShort,NoteLong...不同种类的笔记应该以不同的方式显示在GUI中。我为这些笔记定义了一个基类,叫做NoteBase.我将这些笔记存储在XML中;我有一个从XML文件读取并将笔记数据存储在vectorlist中的类.然后我发现我无法获取它们自己的类型,因为它们已经转换为NoteBase*!虽然if(dynamic_cast(ptr)!=NULL){...}可能有效,它真的太丑了。实现函数取NoteShort*或NoteLong*作为参数不起作用。那么,有什么好的方法可以解决这个问题吗?更新:谢谢大家的回复。我认为这也不应该发生——
接口(interface):templateclassInterface{public:typedefTUnits;virtualTget()=0;};实现1:classImplementation1:publicInterface{public:floatget(){return0.0f;}};实现2:classImplementation2:publicInterface{public:intget(){return0;}};容器(有错误):classContainer{private:Interface*floatGetter;intn;Timer::Units*array;pu
今天我觉得自己像个菜鸟:classBase{public:virtualvoidfoo(int)=0;virtualvoidfoo(int,int){}virtualvoidbar(){}};classDerived:publicBase{public:virtualvoidfoo(int){}};voidmain(){Derivedd;d.bar();//worksd.foo(1);//worksd.foo(1,2);//compilererror:nomatchingfunctioncall}我希望d从Base继承foo(int,int),但它没有。那么我在这里缺少什么?
boost::shared_polymorphic_downcast在boost1.52.0之间消失了和1.53.0.releasenotes中对此没有提及。,并且提交(r81463)仅包含神秘的日志消息“更新shared_ptr转换。”我不清楚我现在应该使用什么,或者为什么删除此功能。有人可以帮忙吗?编辑:感谢大家富有洞察力的评论。我发现自己有点沮丧,因为boost会在没有任何理由或通知的情况下在版本中做出向后不兼容的更改,而且我也感到沮丧的是它们删除了有用的功能。但是根据响应,我可以用两行代码而不是一行代码来完成我想做的事情,所以我认为这就足够了。尽管如此,我仍将这个问题“悬而未决
我正在编写一个C++程序,它将掷骰子和掷硬币。我需要使用继承和多态性。我的虚拟功能设置正确。在我的基类(aRandomNumberGenerator)中,我有一个虚函数生成。在main()中,我需要有一个指向我的派生类(aDie和aCoin)的2个基类指针的数组。当我调用generate()函数时,我如何知道指向数组中的哪个派生类??代码:intmain(){intn;intfrequency1=0;//countof1srolledintfrequency2=0;//countof2srolledintfrequency3=0;//countof3srolledintfrequenc
假设我有一个名为Base的类和一个从它派生的名为SuperBase的类。假设add接受了一个Base*,那么这些是否有效:SuperBase*super=newSuperBase;bases.add(super);或者SuperBase*super=newSuperBase;bases.add((Base*)super); 最佳答案 只要SuperBase通过从派生到基的隐式转换公开派生自Base,第一个就可以工作:structbase{virtual~base(){}};structderived:base{};base*b=ne