Questions tagged «polymorphism»

在计算机科学中,多态是一种编程语言功能,它允许以统一的方式处理不同数据类型的值。

3
从基类调用时,GetType()是否会返回派生最多的类型?
从基类调用时,GetType()是否会返回派生最多的类型? 例: public abstract class A { private Type GetInfo() { return System.Attribute.GetCustomAttributes(this.GetType()); } } public class B : A { //Fields here have some custom attributes added to them } 还是我应该使派生类必须实现的抽象方法如下所示? public abstract class A { protected abstract Type GetSubType(); private Type GetInfo() { return System.Attribute.GetCustomAttributes(GetSubType()); } } public …



12
虚拟函数和vtable如何实现?
我们都知道C ++中有什么虚函数,但是如何在深层次上实现它们呢? 是否可以在运行时修改vtable甚至直接访问vtable? 该vtable是否适用于所有类,或者仅适用于至少具有一个虚函数的类? 对于至少一个条目的函数指针,抽象类是否仅具有NULL? 拥有一个虚拟函数会减慢整个班级吗?还是仅调用虚拟函数?速度是否会受到影响(无论是否实际覆盖了虚函数),或者只要它是虚函数,速度就不会起作用。


7
为什么“纯多态”优于使用RTTI?
我所见过的几乎所有讨论这种事情的C ++资源都告诉我,与使用RTTI(运行时类型标识)相比,我应该更喜欢多态方法。总的来说,我会认真对待这种建议,并会尝试并理解其基本原理-毕竟,C ++是一头强大的野兽,很难全面理解。但是,对于这个特定的问题,我正在空白,想看看互联网可以提供什么样的建议。首先,让我总结一下到目前为止我所学到的东西,列出引起RTTI被“认为有害”的常见原因: 一些编译器不使用它/ RTTI并非始终启用 我真的不赞成这种说法。这就像说我不应该使用C ++ 14功能,因为那里有不支持它的编译器。但是,没有人会阻止我使用C ++ 14功能。大多数项目将对他们正在使用的编译器及其配置方式产生影响。甚至引用了gcc手册页: -fno-rtti 使用C ++运行时类型标识功能(dynamic_cast和typeid)禁止使用虚拟函数生成有关每个类的信息。如果您不使用语言的这些部分,则可以使用此标志节省一些空间。请注意,异常处理使用相同的信息,但是G ++会根据需要生成它。dynamic_cast运算符仍可用于不需要运行时类型信息的强制转换,即强制转换为“ void *”或明确的基类。 这说明如果我不使用RTTI,可以将其禁用。这就像在说,如果您不使用Boost,则不必链接到它。我不需要为有人正在编译的情况做任何计划-fno-rtti。另外,在这种情况下,编译器将大声失败。 花费额外的内存/可能很慢 每当我想使用RTTI时,这意味着我需要访问类的某种类型信息或特征。如果我实现了不使用RTTI的解决方案,这通常意味着我将不得不在类中添加一些字段来存储此信息,因此memory参数实在是无效的(我会在下面进一步举例说明)。 实际上,dynamic_cast可能很慢。不过,通常有避免使用速度要求严格的情况的方法。而且我还没有看到替代方案。这样的SO答案建议使用基类中定义的枚举来存储类型。这只有在您知道所有派生类都是先验的情况下才有效。相当大的“如果”! 从这个答案来看,RTTI的成本似乎也不清楚。不同的人测量不同的东西。 优雅的多态设计将使RTTI不再必要 这是我认真对待的建议。在这种情况下,我简直无法提出涵盖我的RTTI用例的良好的非RTTI解决方案。让我举一个例子: 假设我正在编写一个库来处理某种对象的图形。我想允许用户在使用我的库时生成自己的类型(因此enum方法不可用)。我的节点有一个基类: class node_base { public: node_base(); virtual ~node_base(); std::vector< std::shared_ptr<node_base> > get_adjacent_nodes(); }; 现在,我的节点可以是不同的类型。这些怎么样: class red_node : virtual public node_base { public: red_node(); virtual ~red_node(); void get_redness(); …
106 c++  polymorphism  rtti 

9
gson的多态性
我在使用Gson反序列化json字符串时遇到问题。我收到一系列命令。该命令可以是start,stop或其他类型的命令。我自然具有多态性,并且start / stop命令从command继承。 如何使用gson将其序列化回正确的命令对象? 似乎我只获得基本类型,即声明的类型,而从未获得运行时类型。

4
在GDB中运行应用程序,直到发生异常
我正在开发一个多线程应用程序,我想使用GDB对其进行调试。 问题是,我的线程之一一直死于消息: pure virtual method called terminate called without an active exception Abort 我知道该消息的原因,但是我不知道它在线程中出现的位置。回溯确实会有所帮助。 当我在GDB中运行我的应用程序时,每当线程被暂停或恢复时它就会暂停。我希望我的应用程序继续正常运行,直到其中一个线程死于该异常为止,这时所有内容都应停止,以便获得回溯。

8
避免在Java中使用instanceof
具有“ instanceof”操作链被认为是“代码异味”。标准答案是“使用多态性”。在这种情况下我该怎么办? 有许多基类的子类。他们都不在我的控制之下。类似的情况是Java类Integer,Double,BigDecimal等。 if (obj instanceof Integer) {NumberStuff.handle((Integer)obj);} else if (obj instanceof BigDecimal) {BigDecimalStuff.handle((BigDecimal)obj);} else if (obj instanceof Double) {DoubleStuff.handle((Double)obj);} 我确实可以控制NumberStuff等。 我不想使用几行代码就能完成的代码。(有时,我制作了一个HashMap将Integer.class映射到IntegerStuff的实例,将BigDecimal.class映射到BigDecimalStuff的实例,等等。但是今天我想要一些更简单的方法。) 我想要这样简单的东西: public static handle(Integer num) { ... } public static handle(BigDecimal num) { ... } 但是Java不能那样工作。 我想在格式化时使用静态方法。我正在格式化的东西是复合的,其中Thing1可以包含Thing2s数组,Thing2可以包含Thing1s数组。当实现这样的格式化程序时,我遇到了一个问题: class Thing1Formatter { private static Thing2Formatter thing2Formatter = new Thing2Formatter(); public …

6
Javascript中的多态性是什么?
我读过一些我可以在互联网上找到的关于多态的文章。但是我认为我不太了解它的含义及其重要性。大多数文章都没有说明为什么它很重要,以及如何在OOP中实现多态行为(当然是在JavaScript中)。 我无法提供任何代码示例,因为我不知道如何实现它,因此我的问题如下: 它是什么? 我们为什么需要它? 这个怎么运作? 如何在javascript中实现这种多态行为? 我有这个例子。但是很容易理解该代码的结果。它没有对多态性本身给出任何清晰的想法。 function Person(age, weight) { this.age = age; this.weight = weight; this.getInfo = function() { return "I am " + this.age + " years old " + "and weighs " + this.weight +" kilo."; } } function Employee(age, weight, salary) { this.salary = salary; …

6
如何使用继承对RESTful API建模?
我有一个对象层次结构,我需要通过RESTful API公开它,我不确定URL的结构以及返回的内容。我找不到任何最佳做法。 假设我有从动物那里继承来的狗和猫。我需要对猫狗进行CRUD操作;我还希望能够对动物进行一般的手术。 我的第一个想法是做这样的事情: GET /animals # get all animals POST /animals # create a dog or cat GET /animals/123 # get animal 123 问题是/ animals集合现在“不一致”,因为它可以返回并获取结构不完全相同的对象(狗和猫)。集合返回具有不同属性的对象是否被视为“ RESTful”? 另一个解决方案是为每种具体类型创建一个URL,如下所示: GET /dogs # get all dogs POST /dogs # create a dog GET /dogs/123 # get dog 123 GET /cats # get …

30
多态-仅用两个句子定义
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 5年前关闭。 改善这个问题 我查看了其他定义和解释,但没有一个让我满意。我想看看是否有人可以在不使用任何代码或示例的情况下最多在两个句子中定义多态性。我不想听到“所以你有一个人/汽车/开罐器...”或这个词是如何衍生的(没人知道您知道poly和morph意味着什么)。如果您对多态性有一个很好的掌握,并且英语水平很好,那么您应该能够以简短而密集的定义回答这个问题。如果您的定义准确地定义了多态性,但它的密度如此之高以至于需要进行多次读取,那么这正是我要寻找的。 为什么只有两个句子?因为定义简短而智能。解释很长,其中包含示例和代码。在这里寻找解释(这些页面上的答案对我的问题并不满意): 多态性vs覆盖vs重载 尝试尽可能简单地描述多态性 我为什么要问这个问题?因为有人问我同样的问题,所以我无法给出令人满意的定义(按照我的标准,这是很高的标准)。我想看看这个网站上有没有头脑的人能做到这一点。 如果您真的不能满足两个句子的要求(这是很难定义的主题),那么您过去就可以了。这个想法是要有一个定义,该定义实际上定义什么是多态性,而不解释它的用途或用法(得到差异吗?)。

4
用Jackson将反序列化的JSON反序列化为多态类型-一个完整的示例给我一个编译错误
我正在尝试浏览Programmer Bruce的教程,该教程应该允许多态JSON的反序列化。 完整列表可在此处找到 Programmer Bruce教程(很棒的东西) 我已经完成了前五项工作,没有任何问题,但是我在最后一项中遇到了麻烦(示例6),这当然是我真正需要工作的部分。 编译时出现以下错误 ObjectMapper类型的方法readValue(JsonParser,Class)不适用于参数(ObjectNode,Class) 这是由代码块引起的 public Animal deserialize( JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException { ObjectMapper mapper = (ObjectMapper) jp.getCodec(); ObjectNode root = (ObjectNode) mapper.readTree(jp); Class<? extends Animal> animalClass = null; Iterator<Entry<String, JsonNode>> elementsIterator = root.getFields(); while (elementsIterator.hasNext()) { Entry<String, JsonNode> element=elementsIterator.next(); String name = …

6
为什么Haskell的`head`崩溃在一个空列表上(或者为什么*不*返回一个空列表)?(语言哲学)
其他潜在贡献者的注意事项:请毫不犹豫地使用抽象或数学符号来表达您的观点。如果我不确定您的答案,我会要求您进行说明,否则请随意以一种舒适的方式表达自己。 需要明确的是:我不是在寻找“安全”对象head,也不是head特别有意义的选择。问题的重点在于对head和的讨论head',后者旨在提供上下文。 我已经和Haskell纠缠了几个月了(以至于它已经成为我的主要语言),但是我承认我对某些更高级的概念或该语言的哲学细节并不了解(尽管我非常愿意学习)。那么,我的问题不只是技术性的问题(除非是技术性问题,我只是没有意识到),因为它是一种哲学。 对于此示例,我正在谈论head。 我想像你会知道, Prelude> head [] *** Exception: Prelude.head: empty list 这来自head :: [a] -> a。很公平。显然,不能返回(挥舞着)no类型的元素。但是同时,定义起来很简单(如果不是很简单的话) head' :: [a] -> Maybe a head' [] = Nothing head' (x:xs) = Just x 我见过一些这方面的讨论很少在这里的某些语句的注释部分。值得注意的是,一位Alex Stangl说 “有充分的理由不使一切都“安全”,并在违反前提条件时抛出异常。 我不一定要质疑这个主张,但是我对这些“好的理由”是什么感到好奇。 另外,保罗·约翰逊(Paul Johnson)说, “例如,您可以定义“ safeHead :: :: [a]->可能是一个”,但是现在除了处理一个空列表或证明它不会发生之外,您必须处理“ Nothing”或证明它不会发生。” 我从那条评论中读到的语气表明,这在难度/复杂性/事物方面有明显的增加,但是我不确定我是否理解他在这里提出的内容。 一位史蒂文·普鲁兹纳(Steven Pruzina)说(在2011年不少), “有一个更深层的原因,例如'head'不能防崩溃。要实现多态但要处理一个空列表,'head'必须始终返回任何特定空列表中都没有的类型的变量。如果Haskell能够做到这一点,那就太好了……”。 通过允许空列表处理,多态性会丢失吗?如果是这样,怎么回事,为什么?是否有某些特殊情况使这一点显而易见?此部分由@Russell …


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.