我开始在C++0X/11中使用智能指针,但遇到了一个特殊情况。我想使用shared_ptr向上转换一个对象的实例。Extend类继承自Base类,其中Base类具有虚拟析构函数以使其具有多态性(否则dynamic_pointer_cast会提示非多态类转换)。如果因此:std::shared_ptrobj=std::make_shared();然后我做:obj=std::dynamic_pointer_cast(obj);安全吗?其他指向该对象的指针会怎样?是否只有obj将其视为Extend,而其他共享指针仍将其视为Base?向上转换同一实例是否安全,还是我应该做其他事情?编辑:感谢您
假设我有一个可以保存基类方法地址的指针类型。我可以将子类方法的地址分配给它并期望它正常工作吗?在我的例子中,我将它与基类指针一起使用,对象的动态类型是派生类。structB{typedefvoid(B::*MethodPtr)();};structD:publicB{voidfoo(){cout(&D::foo);(pb->*mp)();}标准在谈论static_cast时是这样说的:5.2.9.9Anrvalueoftype“pointertomemberofDoftypecv1T”canbeconvertedtoanrvalueoftype“pointertomemberofBof
在Swift中,我注意到我可以将符合名为SubProtocol的协议(protocol)的对象向上转换为另一个名为SuperProtocol的协议(protocol),它是子协议(protocol)。但是我不能对协议(protocol)数组做同样的事情。这是我在Playground中运行的示例代码:protocolSuperProtocol{}protocolSubProtocol:SuperProtocol{}classMyObject:SubProtocol{}letvalue1:SubProtocol=MyObject()letvalue2:SuperProtocol=value
classMedia{varname:String=""init(name:String){self.name=name}}classSong:Media{}classMovie:Media{}lets1=Song(name:"Fireproof")varm1:Media=s1//upcasting//vars2:Song=m1vars2:Song=m1asSong//downcasting//varx1:Movie=m1asMovie//在varm1:Media=s1这行你可以设置m1等于s1因为m1的类型是s1的父类(superclass)??在线vars2:Song=m1asSo
C#工厂模式是否需要向上转型?我希望类库G中的上帝在类库A中创建一个亚当,而不是让G依赖于A。上帝产生亚当供类库E中的夏娃消费,夏娃知道并依赖亚当是可以的。(编辑-这个示例越来越好:)我能想到的解决方案是在A中有一个AdamFactory。这样AdamFactory就知道Adam并且可以轻松地创建它(可能只需调用Adam的构造函数)。上帝收到一个AdamFactory并可以命令它创建Adam。现在,因为不允许上帝知道Adam,AdamFacotry的CreateAdam必须返回一个对象,这需要Eve将AdamFactory返回的对象向上转换为Adam。我认为这会奏效。但是,我对向上转型
C#工厂模式是否需要向上转型?我希望类库G中的上帝在类库A中创建一个亚当,而不是让G依赖于A。上帝产生亚当供类库E中的夏娃消费,夏娃知道并依赖亚当是可以的。(编辑-这个示例越来越好:)我能想到的解决方案是在A中有一个AdamFactory。这样AdamFactory就知道Adam并且可以轻松地创建它(可能只需调用Adam的构造函数)。上帝收到一个AdamFactory并可以命令它创建Adam。现在,因为不允许上帝知道Adam,AdamFacotry的CreateAdam必须返回一个对象,这需要Eve将AdamFactory返回的对象向上转换为Adam。我认为这会奏效。但是,我对向上转型
我可以这样做吗?classA{...};classB:privateA{constA&foo()const{return*((constA*)this);}};我可以采用从基类私有(private)继承的子类并将其转换为基类的公共(public)版本吗?如果没有虚拟方法,我可以这样做吗?我的猜测是肯定的,但我想确保它是安全/便携的。 最佳答案 是的,您可以:标准§5.4/7:...thefollowingstatic_castandreinterpret_castoperations(optionallyfollowedbyacon
我可以这样做吗?classA{...};classB:privateA{constA&foo()const{return*((constA*)this);}};我可以采用从基类私有(private)继承的子类并将其转换为基类的公共(public)版本吗?如果没有虚拟方法,我可以这样做吗?我的猜测是肯定的,但我想确保它是安全/便携的。 最佳答案 是的,您可以:标准§5.4/7:...thefollowingstatic_castandreinterpret_castoperations(optionallyfollowedbyacon
我一直在阅读该站点上的其他一些主题,他们提到了dynamic_cast和static_cast是如何安全地进行向上转换的。为什么向上转换甚至需要这些?例如,如果类B派生自A,则A*ptr=newB();仍然有效,并且表现得像A类型的对象。(我也来自Java背景,其中不需要进行向上转换的转换。我还在这个网站上读到,向下转换不需要dynamic_cast[有问题的“Whenshouldstatic_cast,dynamic_cast,const_castandreinterpret_castbeused?”].同样,我认为只有在向下转型时才真正需要转型,因为向上转型是自动发生的。我哪里错了
灵感来自thisquestion,我尝试了以下代码:structA{virtualvoiddoit()const=0;};structB:publicA{virtualvoiddoit()const;};structC:publicA{virtualvoiddoit()const;};voidfoo(boolp){constA&a=(p?static_cast(B()):static_cast(C()));a.doit();}EverycompilerIhavetried使用-Wall-Werror接受此代码并生成我想要的程序集。但是在仔细阅读了C++03规范第12.2节(“临时对象”