草庐IT

Upcasting

全部标签

arrays - Swift - 将协议(protocol)数组向上转换为 super 协议(protocol)数组会导致错误

在Swift中,我注意到我可以将符合名为SubProtocol的协议(protocol)的对象向上转换为另一个名为SuperProtocol的协议(protocol),它是子协议(protocol)。但是我不能对协议(protocol)数组做同样的事情。这是我在Playground中运行的示例代码:protocolSuperProtocol{}protocolSubProtocol:SuperProtocol{}classMyObject:SubProtocol{}letvalue1:SubProtocol=MyObject()letvalue2:SuperProtocol=value

swift - Swift 中的向上转换和向下转换混淆?

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++ - 我可以使用 C 风格的转换将派生类转换为私有(private)基类吗?

我可以这样做吗?classA{...};classB:privateA{constA&foo()const{return*((constA*)this);}};我可以采用从基类私有(private)继承的子类并将其转换为基类的公共(public)版本吗?如果没有虚拟方法,我可以这样做吗?我的猜测是肯定的,但我想确保它是安全/便携的。 最佳答案 是的,您可以:标准§5.4/7:...thefollowingstatic_castandreinterpret_castoperations(optionallyfollowedbyacon

c++ - 我可以使用 C 风格的转换将派生类转换为私有(private)基类吗?

我可以这样做吗?classA{...};classB:privateA{constA&foo()const{return*((constA*)this);}};我可以采用从基类私有(private)继承的子类并将其转换为基类的公共(public)版本吗?如果没有虚拟方法,我可以这样做吗?我的猜测是肯定的,但我想确保它是安全/便携的。 最佳答案 是的,您可以:标准§5.4/7:...thefollowingstatic_castandreinterpret_castoperations(optionallyfollowedbyacon

c++ - Casting - 为什么我应该为 Upcasting 做这件事

我一直在阅读该站点上的其他一些主题,他们提到了dynamic_cast和static_cast是如何安全地进行向上转换的。为什么向上转换甚至需要这些?例如,如果类B派生自A,则A*ptr=newB();仍然有效,并且表现得像A类型的对象。(我也来自Java背景,其中不需要进行向上转换的转换。我还在这个网站上读到,向下转换不需要dynamic_cast[有问题的“Whenshouldstatic_cast,dynamic_cast,const_castandreinterpret_castbeused?”].同样,我认为只有在向下转型时才真正需要转型,因为向上转型是自动发生的。我哪里错了

swift - Swift 中的元组 "upcasting"

如果我有一个带有签名(String,Bool)的元组,我不能将它转换为(String,Any)。编译器说:error:cannotexpresstupleconversion'(String,Bool)'to'(String,Any)'但这应该有效,因为可以使用as将Bool安全地转换为Any。如果你这样做,几乎会抛出同样的错误:letany:Any=("String",true)anyas!(String,Any)//erroranyas!(String,Bool)//obviouslysucceeds错误:Couldnotcastvalueoftype'(Swift.String,

c++ - upcasting 和 vtables 如何协同工作以确保正确的动态绑定(bind)?

因此,vtable是由编译器维护的表,其中包含指向该类中的虚函数的函数指针。和将派生类的对象分配给祖先类的对象称为向上转换。向上转换是使用基类指针或引用处理派生类实例/对象;对象未“分配给”,这意味着覆盖了值alaoperator=调用。(感谢:TonyD)现在,如何在运行时知道应该调用“哪个”类的虚函数?vtable中的哪个条目引用了应该在运行时调用的“特定”派生类的函数? 最佳答案 您可以想象(尽管C++规范没有这样说)vtable是一个标识符(或其他一些可用于“查找有关类本身的更多信息”的元数据)和一个函数列表。所以,如果我们
12