问题标签 [run-time-polymorphism]

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.

0 投票
1 回答
106 浏览

java - 如何调用父类方法

我正在研究运行时多态性,我找到了一个这样的例子

这里 Bike 类对象 b 可以访问 Splender 的方法 run 没问题,那么我们可以访问 Bike 的 run() 方法吗?如果是,那怎么办?如果不是那为什么?

0 投票
0 回答
68 浏览

c# - 如何在 C# 中使用 IList 将父级类型转换为子级

下面是我在 C#.Net 中的 DTO

现在,当我使用 IEnumerable 初始化具有子实体的博客时,不需要错误或显式转换。IE,

但由于某种原因,我需要使用 IList 而不是 IEnumerable 作为

但是当更新时&尝试分配子实体

如何IList<Parent>映射IList<Child>

谢谢!

0 投票
1 回答
93 浏览

c++ - 基于类型映射的运行时类型选择

背景

我正在编写一个使用 USB 设备的应用程序。这包括我的应用程序可以使用的 USB 设备的设备发现,基于 USB 供应商 ID 和产品 ID。然而,这些设备有时有多个可能工作的驱动程序,即应用程序实现,具体取决于平台和月相(客户遗留的东西)。所以我想使用运行时多态性,并使用std::shared_ptr一系列不错的接口和东西。

问题

根据运行时给定的键,我无法弄清楚如何处理make_shared某种类型的对象。至少在不丑陋的意义上不是。

到目前为止的解决方案

我正在考虑以某种方式将类型值存储到映射known_drivers中(在此示例中为多映射,但差别不大),以便最终根据数字值构造不同的类类型并将其填充到shared_ptr.

示例代码

0 投票
3 回答
147 浏览

java - 动态方法分派和运行时多态性错误

我正在尝试了解动态方法调度。

为什么会显示错误?为什么我不能创建 B 或 C 类型的变量 r 并调用 callme() 方法?

编辑:为了澄清一些事情,我不想使用相同的变量名,我想说的是,而不是 A r; 我正在尝试使用 B r 并保持其余代码相同。

0 投票
1 回答
27 浏览

c++ - 通过将对象显式存储为基类来抑制虚拟机制?

如您所料,我遇到了一个我无法回答且只能猜测的问题。

运行时多态性是目标,使用虚拟机制,但我得到的结果好像我在抑制它的同时调用了该方法;就像我调用基类方法一样。

我只能猜测我正在以某种方式这样做,调用来自作为基类的对象,尽管它作为派生类构造的。因此,构造为派生,存储为基础。

我确实将它作为静态基类变量存储在 cpp 中,并与多个外部函数接口以在其他地方访问。(也许,这就是问题所在?)

游戏场景.h:

游戏场景.cpp:

入口点.cpp:

因此,我遵循了一种与 SceneInit() 一起调用 LevelInit() 的模式,该模式在派生类中被覆盖。如果我在 NewScene() 中使用任一派生类构造函数,我会在运行时获得那些 LevelInit() 结果。我认为将此模式与 UpdateScene() 一起使用是安全的。

我看到的是名为 GameScene::UpdateLevel() 的 UpdateScene(),尽管它在子类中被明显覆盖,就像 LevelInit() 一样。

我的(疯狂的)猜测是,我正在调用 UpdateLevel(),就好像我已经明确地将其转换为 GameScene。:\

也许,这是因为我将 currentScene 存储GameScene?(但是,这不是破坏了多态性的目的吗?)

我遗漏了一些关于存储 currentScene 或调用 UpdateLevel() 的内容。我试过这样打电话:

读完之后,作为一个指针,虚拟机制应该是找到该方法的最衍生版本。(可惜...)

我希望我能在这里或其他地方找到一个例子,但我的搜索指出了构造函数/解构函数中的虚拟问题,或者只是不使用“虚拟”关键字等。

0 投票
1 回答
56 浏览

c++ - 运行时多态性 - 箭头运算符访问错误的成员?

我的程序中有以下课程:

还有一个函数f,它接受指向类对象的指针base和它所指向的数组的大小:

这是主要的:

第一次调用的输出是1 1 1 1 1,这是正确的。

但是第二次调用的输出是1 2 1 2 1,这对我来说是非常出乎意料的。似乎 的值dval被打印出来,而不是函数内循环bval的每第二次迭代。forf

int dval2此外,如果我在 class 中包含另一个私有数据成员,则每次执行它时都会deri输出到第二次调用(因此 65535 看起来不像任何随机值)。1 2 65535 1 2

为什么箭头运算符会表现出这种行为

0 投票
1 回答
98 浏览

c++ - C++模板编程设计题——根据输入文件返回不同类型

一个多媒体文件可能有不同日期类型的数据,例如 uint8_t、int16_t、float 等。下面三个例子展示了文件内容,第一个字节表示数据类型:

FileReader 类读取文件并返回不同类型的 DataStream。我使用 DataStreamBase 以便客户端持有一个指针。

客户端直到运行时才知道输入文件是否包含 uint8_t、int16_t 或浮点数据。

问题:客户端如何获取指向 uint8_t、int16_t、float、...的指针,这些指针可以传递给第三方库?这种设计是解决这类问题的正确方法吗?谢谢。

0 投票
2 回答
72 浏览

c++ - 为什么基类指针指向基类中的纯虚方法,而不是派生类中的覆盖方法?

如果 的构造函数Foo引用 的对象B,那么这个程序会按照我期望的方式执行,即a_ptr->foo()调用B::foo().

但是,如果将构造函数更改为按值接受参数,则a_ptr->foo()解析为A::foo(),并导致pure virtual method called exception

示例输出(通过引用传递:):

示例输出(按值传递):

我对为什么会发生这种情况有一种模糊的预感,我正在寻找一些可能证明或反驳我的假设的文献或参考资料:当通过引用传递时,基类指针a_ptr指向一个生命周期超过打电话给a_ptr->foo().

但是,当按值传递时,a_ptr指向一个临时对象,该临时对象在构造函数退出时会丢失。

我想这与VTABLEof 有关A,但我不能完全确定它。

0 投票
2 回答
1077 浏览

enums - 在 Rust 中使用枚举实现动态多态性

当一个人已经知道某些需要动态多态性的代码中涉及的所有有限数量的类型时,enum与 using 相比, using 可以更好地提高性能,Box因为后者使用动态内存分配,并且您需要使用具有虚函数调用的 trait 对象作为出色地。

也就是说,与使用std::variantand的 C++ 中的等效代码相比,std::visit在这种情况下,Rust 似乎涉及更多样板代码,至少对我来说是这样(我还没有学会使用过程宏)。在这里举个例子:我有很多struct类型:

它们都实现了以下特征AlphabetLetter

由于所涉及的类型集是已知且有限的,我想使用enum

在这里我们已经有了第一个样板:我需要为enum涉及的每个类型变体的值添加一个名称。但真正的问题是:enum Letteris 本身是一个AlphabetLetter,它只是表示我们在运行时不知道它是哪个字母的事实。所以我开始为它实现特征:

是的,这很容易变成很多代码,但我没有找到其他方法。在 C++ 中,多亏了泛型 lambda,一个可以只是std::visitastd::variant并且它是一个单行。如果不手动为特征 X 中的每个变体中的每个函数编写所有模式匹配,我该如何做同样的事情enum

0 投票
0 回答
61 浏览

rust - 如何向上转换 Rc

是否可以向上转换Rc<dyn Foo>?如果不是,为什么不呢?

结果是