问题标签 [upcasting]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 将孩子分配给父母
我在将子指针分配给父指针时遇到问题。这是示例:
为什么会这样?如果我写这个:
然后它可以工作,但我想知道为什么会这样。
这只是一个例子,我不能透露真实的代码,所以如果你发现语法错误,那是因为我刚刚写了它。谢谢!
编辑:我的编辑告诉我:“B* 类型的值不能分配给 A* 类型的实体”。这是什么意思?
java - 为什么要向上转换 List 对象?安卓/Java语法
我最近一直在阅读许多 Android 项目的代码,以获得更多的理解。我看到的一件事是 ArrayList 实例化的两种方式的区别。
请注意此处显示的这两个示例。为什么有些人使用示例 1,为什么您会在示例 2 中这样做,它们之间的主要区别是什么?
我了解 Java 中向上转换和向下转换的概念,并且在这种特殊情况下看不到任何优势。如果您要创建一个arrayList,为什么不从一开始就将它存储在一个ArrayList 变量中呢?
我一直使用示例 2 方式来创建一个新的 ArrayList。我不明白使用示例 1 中显示的内容有什么好处
看起来更多的程序员使用示例 1 方式
示例 1,使用向上转换为父变量
示例 2
c# - 编译器是否优化了不必要的/冗余的向上转换,或者它是否产生任何 IL?
从冗余演员表得到优化吗?我可以看到编译器没有优化不必要的向下转换(即castclass
)。但现在我对一个更简单的情况感兴趣,“如果编译器优化了不必要的向上转换?” 这个问题只涉及引用类型,而不涉及boxing
.
在我看来,这upcast
不会产生任何 IL,因此冗余显式upcast
根本不需要成本?upcast
还是因为 IL 指令是无类型的,所以在幕后仍然存在冗余显式的性能成本?
或者有时会向上转换产生任何 IL 指令?
c++ - 使用自定义转换运算符向上转换为模板类
我有一个类继承自两个类,一个是我自己的基类,一个是模板类:
在某些时候,我必须做一个分配,它将基类对象从主机复制到设备,如下所示:
但在我能做到这一点之前,我必须将我的this上载到它的基类csr_matrix
我尝试过使用static_cast和自定义转换运算符:
但是,当我尝试执行实际操作时,编译器会出现大量错误
实际上,此时静态转换也超出了我的范围:
然而,一个没有 typedef 的 C 风格霰弹枪似乎可以工作:
但使用 typedef 失败:
那么,如何使用自己的自定义运算符安全地向上转换,最好使用静态转换?
为什么使用完整的 namespace::type 进行强制转换工作,但使用 typedef 失败?
java - Java 6 中的向下转型有多昂贵?
有一个方法接收一个类型的参数,当它使用该参数时Collection
,它需要使用List
类中的一些方法。就速度而言,向上转换成本高吗?
我还想指出,collection
在此之后不再使用该对象,只有list
, 并且它将在 Oracle Java 1.6 上编译和运行。
c++ - 我可以使用 C 风格的转换将派生类转换为私有基类吗?
我可以这样做吗?
我可以采用从基类私有继承的子类并将其转换为其基类的公共版本吗?我可以在没有虚拟方法的情况下做到这一点吗?
我的猜测是肯定的,但我想确保它是安全/便携的。
inheritance - 使用带有派生类型参数的函数 (F#)
我的应用程序中有一个类 - 为简单起见,我们假设它是这样定义的:
此外,我有很多函数将这种类型的对象作为参数。此外,其中一些采用这种类型的数组:
现在我意识到,拥有另一个派生自“baseType”的类会很好。例如:
但是,我不能将继承类型的数组与“myFun”等函数一起使用
这将是“很高兴”。有没有一种简单的方法可以重用我的功能而无需进行太多更改?
我想解决方案之一是使用例如函数 (fun (d : inhType) -> d :> baseType) 映射我的数组,但我想知道是否还有其他事情可以做。
c++11 - unique_ptr 向上转换作为回报
我有这个函数应该生成不同的派生对象并返回为unique_ptr<base>
:
即使使用 std::move,我也无法让这件事继续下去。(也使用了dynamic_cast,但可能做错了)。
这是我得到的错误:(ArchLinux 上的 gcc (GCC) 4.8.1 20130725 (prerelease))
我希望我已经清楚我想做什么。
我该怎么做?谢谢。
c++ - 通过基指针将派生类转换为基数之一
编辑:好的,正如我现在看到的,这改变了很多情况,所以更精确的情况是这样的:
我目前拥有的层次结构与此有些相似:
我在尝试强制转换对象并调用函数时遇到 Visual Studio 错误:
通过派生对 IBase 接口的所有调用都可以正常工作,但是当我尝试将派生转换为 IDerived 时,调用任何函数时都会出现错误:
我猜这样的转换是非法的,但是我怎样才能转换指针,以便我可以访问 IDerived 接口方法(最好没有 dynamic_cast,如果存在的话,我更喜欢一个好的和可移植的 hack ;))?是否有可能以某种方式计算指针的偏移量,以便使用正确的 vtable 并且一切正常?
我已经编程了很长时间,但我总是避开那些对具有大量界面和模板的工程系统的幻想,现在我注定要自己制作一个。
编辑:现在你可以看到这变得棘手和困难。我不知道我得到的 Derived 的确切类型,因为它是模板化的,函数 CreateDerived 也是模板化的并返回接口。
此外,其中一项要求是不使用 dynamic_cast(项目中禁用了 RTTI)
c# - Upcast/Downcast 和序列化
只是在玩铸造。假设,我们有 2 个类
实例化他们两个
现在,让我们尝试向上转型
似乎 b2 仍然持有字段 b,该字段仅在 Inh 类中出现。让我们通过向下转换来检查它。
此处检查为真(我猜,因为 i2 和 i3 引用同一个实例 i1)。好的,让我们看看,它们将如何存储在数组中。
一切都很好,总和是 15。但是当我尝试使用 XmlSerializer 序列化数组时(只是为了看看里面有什么),它返回 InvalidOperationException “类型 ConsoleApplication1.Inh 不是预期的”。好吧,很公平,因为它的基地阵列。
那么,实际上 b2 是什么?我可以序列化一组 Bases 和 Inhs 吗?我可以通过从反序列化数组中向下转换项目来获取 Inhs 字段吗?