- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我一直在阅读该站点上的其他一些主题,他们提到了 dynamic_cast 和 static_cast 是如何安全地进行向上转换的。
为什么向上转换甚至需要这些?
例如,如果类 B 派生自 A,则
A * ptr = new B ();
仍然有效,并且表现得像 A 类型的对象。(我也来自 Java 背景,其中不需要进行向上转换的转换。
我还在这个网站上读到,向下转换不需要 dynamic_cast [有问题的“When should static_cast, dynamic_cast, const_cast and reinterpret_cast be used?”].同样,我认为只有在向下转型时才真正需要转型,因为向上转型是自动发生的。
我哪里错了?
最佳答案
如果您有复杂的继承层次结构,默认的向上转换行为可能不起作用。考虑例如:
struct A {};
struct B : A {};
struct C : A {};
struct D : B, C {};
在该层次结构中,D
类型的对象有两个不同的A
类型的基。从 D*
到 A*
的转换是不明确的。对于这种类型的情况,您可以强制执行中间步骤
A *p = static_cast<B*>(d); // Give me the 'A' subobject within 'B'
类似地,如果有一个具有多个重载的函数可以采用基类型或派生类型,并且您需要调用采用基类型的版本(注意:这里有代码味道!),那么您可以使用强制转换来指示过载决议。同样,如果您需要直接重载决议,您可能做错了其他事情。
除了极端情况(即当默认向上转换不起作用时),确实没有理由明确使用转换操作,我实际上建议不要这样做,因为转换应该是一个警示灯,过度使用它们可能会使它们正常并且在读取代码时不会发出警报。
关于c++ - Casting - 为什么我应该为 Upcasting 做这件事,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16286023/
我有这个例子: class One { public void testOne(){System.out.println("One!!!");} public void testTwo
我可以看到“upcast”一词与OOP有关,但我通过搜索互联网找不到确切的定义。 谁能解释这个术语是什么意思以及这种技术在什么情况下有用? 最佳答案 根据您发布的标签的描述: Upcasting pe
我定义了一个带有抽象约束的抽象类: abstract class Asset where P : Parm { } abstract class Parm { } class StockParm :
假设B是D的基类(可能是虚的,可能是多重继承,不一定是直接基类)。 设 obj 是 D 类型的对象(不是 D 的子类——恰好是 D ). 让 D * d = std::addressof(obj);
假设我有一个可以保存基类方法地址的指针类型。我可以将子类方法的地址分配给它并期望它正常工作吗?在我的例子中,我将它与基类指针一起使用,对象的动态类型是派生类。 struct B { typed
抽象类的目的不是让开发人员创建基类的对象然后向上转换它,AFAIK。 现在,即使不需要向上转换,我仍然使用它,它是否在某些方面被证明是“不利”? 更多说明: 来自 C++ 中的思考: Often in
为什么只有在 Main.main() 中取消注释第三条语句时才会出现 ClassCastException ?没有异常(exception),但第一条和第二条语句执行得很好? public class
只是玩类型转换。假设,我们有 2 个类 public class Base { public int a; } public class Inh : Base { public int
我有以下java代码: class A { int someMethod () { return 1; } int someMethod (A a) { return 2; } int some
两个类: public class ClassA implements ClassC { private static final long serialVersionUID = 111111
在 Java 中, "Up-casting is casting to a supertype, while downcasting is casting to a subtype. Supercas
我有 2 个类 Test(Base) 和 Program(child)。现在我在沮丧的时候遇到了一些问题。 Test t = new Program();// upcasting-wo
如果我有一个带有签名(String, Bool) 的元组,我不能将它转换为(String, Any)。编译器说: error: cannot express tuple conversion '(St
C# 工厂模式是否需要向上转型? 我希望类库 G 中的上帝在类库 A 中创建一个亚当,而不是让 G 依赖于 A。上帝产生亚当供类库 E 中的夏娃消费,夏娃知道并依赖亚当是可以的。(编辑 - 这个示例越
class A { } class B extends A { } class Main { public static void main(String[] args) {
假设我有一个现有的聚合 CustomAggregate 和一个由该聚合处理的事件 CustomEvent。 一段时间后,当事件存储已包含此聚合的一些事件时,我需要将聚合和事件重命名为 NewCusto
我正在使用 FunKTiale 库执行模式匹配。然后,当我按如下方式初始化变量时: private lateinit var socket = Option.None 下面的转换是不可能的: sock
我有两个 View ,A 和 B,都继承自 C。 在 Storyboard 中,我将 UIViewController 定义为 C 类型。 另一个 View ,比方说 D,有到 C 的两个 segue
我有一个二维 numpy 数组,我想将特定的 dtype 应用于每一列。 a = np.arange(25).reshape((5,5)) In [40]: a Out[40]: array([[ 0
我一直在阅读该站点上的其他一些主题,他们提到了 dynamic_cast 和 static_cast 是如何安全地进行向上转换的。 为什么向上转换甚至需要这些? 例如,如果类 B 派生自 A,则 A
我是一名优秀的程序员,十分优秀!