问题标签 [downcast]
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++ - 向下转换指向具有附加功能的派生类的共享指针 - 这安全吗?
考虑以下大纲:
在这里,我使用添加功能(AdditionalFunctionality
方法)的派生类来扩展基类。
第一个问题,这样好吗?我读过很多问题说这不好,您应该在基类中声明附加功能(通常建议在基类中将它们设为纯虚拟方法)。但是,我不想这样做。我想扩展基类的功能,而不仅仅是以不同的方式实现它。有没有更好的解决方案来实现这个目标?
好的,所以在这段代码中,我还使用 STL 容器来存储这些指针,这允许我存储指向 Base 类型对象和 Derived 类型对象的指针,而无需对对象进行切片。
第二个问题,这是有道理的,对吧?实际上,我是通过使用指向基类对象的指针而不是基类对象本身来避免切片?
如果我“知道”某个指针指向 Derived 对象,那么我会使用它std::dynamic_pointer_cast
来强制转换智能指针。
第三个问题,这个编译没有警告并且可以工作,但是它安全吗?有效的?它会破坏共享指针的引用计数方面并在我预期之前失败到delete
我的对象或它们吗?delete
最后,我可以使用复制构造函数或通过赋值来执行此转换,如 p1 和 p2 所示。有没有首选/正确的方法?
类似的问题:
- 将 shared_ptr<Base> 向下转换为 shared_ptr<Derived>?:这非常接近,但是衍生类没有像我的那样添加额外的功能,所以我不确定它是否完全一样。此外,它使用
boost::shared_ptr
我正在使用的地方std::shared_ptr
(尽管我理解 boost 将 shared_ptr 捐赠给了 std 库,所以它们可能是相同的)。
谢谢您的帮助。
编辑:
我问的一个原因是我意识到可以(错误地)执行以下操作:
我尝试将指向 Base 对象的指针向下转换为 Derived 对象的指针,然后调用仅在 Derived 类中实现的方法。换句话说,指向的对象没有定义(或者甚至没有“意识到”该方法)。
这不会被编译器捕获,但可能会导致段错误,具体取决于AdditionalFunctionality
定义方式。
java - 列表对象的继承和强制转换
我无法将水果列表转换为列表中包含的水果子类。
我如何投射橘子,使其成为橙色类的列表?这是一个糟糕的设计模式吗?基本上,我从作为水果列表的服务器获取 JSON 响应。对于对 Web 服务的每个特定调用,我知道我将获得 Fruit 的哪个子类,因此我需要适当地转换该 List。
delphi - 软件设计:Delphi 中类层次结构的适配器(泛型与向下转型)
我想对以下问题提出一些建议:假设您想为 VCL 控件编写适配器。所有适配器都应该具有相同的基类,但在包装特殊控件方面有所不同(例如,从 TEdit 获取值与从 TSpinEdit 获取值不同)。所以第一个想法是创建一个类层次结构
现在我想介绍一个字段来保存对 vcl 控件的引用。在我的特殊适配器中,我当然希望使用具体的子类。但是 Base 类也应该包含一个引用(例如,如果我想使用适配器使控件可见)。
可能性 1(属性访问器中的向下转换):
因此,如果我实现了一个特定的方法,我将使用属性 Control,如果我在我的基类中做某事,我将使用受保护的字段。
可能性 2(使用通用基类):
您更喜欢哪种解决方案?还是有第三种更好的解决方案?
亲切的问候,
基督教
c - 指针向上和向下
指针向下转换
输出:
问题:为什么将样本分成 char 大小的数据?而当进行指针运算时,它是如何得到它的剩余值的呢?这怎么可能?
指针向上转换
输出:
问题:为什么 *ptrUint 中有一个垃圾值?为什么垃圾值类似于ptrUint?是否应该使用 malloc() 或 calloc() 来避免这个垃圾值?你会建议什么样的补救措施来删除垃圾值?
scala - Scala:向下转换抛出 java.lang.ClassCastException
从非 Java 背景到 Scala 给我带来了各种各样的困难,包括这个。
我知道抛出 ClassCastException 是因为在运行时,a
它看起来不像是 B,但实际上它是(据我所知)。这里发生了什么?任何解决方法?谢谢。
编辑:JVM如何理解a
不能转换为B
?它会在 和 之间进行一些浅显的比较a.getClass
吗B
?
附言。我正在尝试将私有变量添加到库类,并覆盖接受库中定义的类作为参数的类方法之一(我试图将字段添加到的类)。
java - 从对象向下转换为整数运行时错误:java.lang.ClassCastException
运行时异常java.lang.ClassCastingException
——...
我知道向下转换是不安全的,但为什么会发生这种情况?我也尝试将 to 转换ArrayList
为String
to Integer
,int
但我得到了同样的错误。
c++ - C++ 多态类、虚函数和性能转换
我有以下课程:
还有其他类都继承自 State。他们的区别仅在于他们如何评估 isTerm() 这取决于行为。我宁愿不使用虚函数 bur 覆盖函数 isTerm,如果不是因为有一些其他模板类旨在与各种状态派生类一起使用。其中之一是政策:
updateOptimal 必须获得一个 State 派生类(取决于行为),从 State *ptr 向上转换为当前使用的任何 S 类型,以便搜索该状态的策略。现在,因为状态派生类是多态的,我认为这是正确的做法:
其中 iter 是 Actions 的迭代器,每个 action 都有一个State *nextstate;
action->nextstate 指针设置在其他点:
我可以对整个类 Action 进行模板化,以避免使用State *nextstate;
和使用S *nextstate;
,但这需要在整个项目中进行大量更改。
阅读cplusplus.com上的转换教程,我的理解是最好使用 dynamic_cast,因为它会在向上或向下转换之前进行类型检查。但是,在转换后的以下代码中,除了将其用于搜索之外,我对向上转换的状态不做任何事情:
其中 findPolicy 是:
- 可以跳过安全检查并使用静态演员表吗?我已经尝试过了,它可以编译。
- 可以完全跳过检查并进行 reinterpret_cast 吗?我也试过了,它可以编译。
- 进行 dynamic_cast 的惩罚是什么?我知道开销很小,但这有什么严重的吗?
- 有没有办法在不使用多态类(避免虚函数并简单地覆盖它)的情况下从 State *ptr 向上转换为 S-type *ptr?
c#-4.0 - 类型参数 - 从类型 T 获取具体类型:IMyInterface
假设我有一个List<IMyInterface>
...
我有三个实现IMyInterface
: MyClass1
,MyClass2
和MyClass3
我有一个只读字典:
我有另一个界面,IFunnyInteface<T> where T : IMyInterface
我有一个方法:
我正在尝试调用 FunnyClasses 的构造函数并将 MyClass 对象作为参数插入。我不想知道它是哪个对象:我只想用 MyClass 作为参数来实例化一些 FunnyClass。
当我调用 ConvertToFunnyClass 时会发生什么,T
是 type IMyInterface
,当我尝试将它转换为 时FunnyInterface<T>
,它说我无法转换FunnyClass1
,例如FunnyInterface<IMyInterface>
我目前的解决方法(不是一个漂亮的解决方法)是这样的:
而且我不喜欢它,因为返回类型是dynamic
,所以当我从其他地方访问它时,我不知道它是什么类型,并且我失去了智能感知等等。我也不知道任何性能影响。
有什么线索吗?
提前致谢!
解析度
当我使用 C# 4.0 时,我可以使用协方差(仅输出位置)停止转换错误,所以我将我的更改IFunnyInterface
为
谢谢大家的回复。
c++ - 一个人如何降低 std::shared_ptr?
考虑:
(请注意,我不能简单地做 a std::shared_ptr<ChildOne>(static_cast<ChildOne*>(ptr.get()))
,因为那样引用计数不会在两个shared_ptr
s 之间共享)
c++ - 私有范围内私有继承的动态向下转换
我遇到的这个问题的调整。考虑:
aPtr1
实际上,因为is 是 type B*
,并且我们可以完全访问B
并从 继承它A
,所以我希望这两种强制转换都能正常工作。但他们没有;为什么?有没有另一种方法来实现这个演员?
注意:
- 如果
foo()
不是 B 的成员,则两个强制转换都会失败。 - 如果从公开
B
继承,这两种演员都可以工作。A