问题标签 [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 回答
146 浏览

c++ - 虚函数调用非虚函数,反之亦然

我有一个class A作为基类的class B.

我在我的虚拟函数中调用了非虚拟函数 ,如下所述。abc()xyz()

由于运行时多态性,B:xyz被称为——我明白这一点。

但是,我不明白,为什么后面跟着B:abcand not A:abc,因为abc它是一个非虚拟函数。

请注意:我遇到了以下问题:Virtual function calls a non-virtual function。它提到abc()在虚函数中调用等效于this->abc(),因此是输出。但是,我不确定我是否理解这部分。

因为,当我做相反的事情(即调用虚函数的非虚函数)时,会显示正确的运行时多态性。那么 this 指针会发生什么?

0 投票
0 回答
29 浏览

inheritance - 为什么即使派生类中的公共函数是被调用的,下面的代码也会出错?

在下面的代码中,一个公共函数覆盖了基类 ob->hello() 中的一个私有虚函数,它应该在公共的派生类中调用 hello()。为什么我仍然看到 hello() 是私有的错误。

0 投票
1 回答
141 浏览

c++ - dynamic_cast<> 的开销是多少

所以我已经用 C++ 编程了一段时间,有人告诉我,使用动态转换将抽象类指针的指针转换为不同的具体类指针是不好的做法。

其中 Shape 是一个抽象类,而 Triangle 继承自它。

当您继承的一个类与抽象类所包含的通用函数有点不同并且需要更多的东西时,使用动态转换似乎是一种访问成员函数的便捷方式。我只是想知道什么是坏的或运行时多态性的开销是什么?

0 投票
0 回答
26 浏览

ios - 为什么 Swift 5.0.1 和 5.3.2 之间的错误运行时多态性不同

我遇到了一个难以理解的问题,但我想问问了解它的可能性。

此代码由帮助我解决另一个问题的人提供:

我除了运行时多态之外,转换应该起作用,并且proto hello在传递URLError对象时应该打印以下调用:

但这是我得到的,在 Swift 5.0 中,铸造工作,在 Swift 5.3 中,铸造不起作用。

在这里尝试 replit.com 进行个人测试和演员工作

在此处输入图像描述

swift 版本是 5.0.x,如图所示:

在此处输入图像描述

我在本地操场上测试了代码,铸造不起作用,我的快速版本是:

此外,提供代码的人在他的机器上安装了 Swift 5.4,并且铸造对他也不起作用。

希望哪位能回复一下,写的更简单,适合初学者。


更新

某人告诉我

尝试将其添加为 value() 中的第一行: print(type(of: error)) 你可能会对它打印出来的内容感到惊讶。

如果在这里有帮助,我想分享我的回复:

我确实有想过它会在两个版本中打印什么。

对于 5.0 版,它打印:

在 5.3 版中,它打印:

我有一个答案,为什么以下表达式有效:

这适用于 Swift 的两个版本。

它与 swift 中的自动桥接有关,swift 中存在一系列类型,它们在 Objective-c 中具有对应的类型。NSString<-->String是另一个示例。

所以,我相信这是因为结构URLError符合Error协议,而类NSError符合Error协议,所以就像Error协议是这种转换的桥梁......我觉得它有点道理。

但是,我是一个URLError
演员,Error
在运行时被问到你实际上是什么类型
我应该回答我NSError吗?!是NSError介于两者之间吗?

Swift 5.0 确实看到了 URLError 的实际对象,但 Swift 5.3 没有。

当我将已经转换为 NSError 的对象传递给:

然后他们俩都将其视为 NSError 然后结束:

我对此案感到有道理。

完成此评论后,我觉得这像是 5.0 中的错误行为并在更高版本中修复?并且一旦你构造了任何符合 Error 协议的类型,它的实际类型就从运行时检查中隐藏了?

0 投票
1 回答
54 浏览

c++ - 在 C++ 中实现虚函数和运行时多态性时的编译时错误

我创建了以下程序来在 C++ 中实现运行时多态性

它使用构造函数、“新”内存分配器运算符和虚函数来实现其目的

问题是:

考虑一家同时出售书籍和录像带的书店。创建一个称为媒体的类,用于存储出版物的标题和价格。

但它最终会出现以下错误

我在 Ubuntu 的 VSCode 中使用 GNU-GCC 编译器

0 投票
3 回答
153 浏览

c++ - C++:对于这种(多调度)运行时多态性,是否有更优雅的解决方案?

主要问题很简单,真的。给定一个基类(更抽象的)和多个需要相互交互的派生类,你如何去做呢?

举一个更具体的例子,这里是一个 2d 视频游戏的 hitboxes 实现:

与头文件:

我对此的主要问题是每个派生类都需要在重写函数中进行的“is-a”检查。

我看到的替代方案是访问者设计模式,但这可能:

  1. 对于这个看似简单的问题来说太复杂了。

  2. 导致的问题多于解决方案。

该代码应该保留的一个特性是,没有派生类被强制实现与每个(或任何其他派生类)的交互。另一个是能够将所有派生对象存储在基本类型数组中而无需任何对象切片。