哪个OO概念是"Base b = new Derived()"的一个例子?

Myk*_*yev 10 c# c++ oop

我正在通过测试并遇到一个问题,我们没有与同事达成协议.

С++

  1 class Base {};
  2 class Derived : public Base {};
  3 class Foo
  4 {
  5 public:
  6     Foo()
  7     {
 -8-         Base* b = new Derived(); // Concept name is?
  9     }
 10 };
Run Code Online (Sandbox Code Playgroud)

C#

  1 abstract class Base{}
  2 public class Derived : Base{}
  3
  4 public class Foo
  5 {
  6    public Foo
  7    {
 -8-        Base b = new Derived(); // Concept name is?
  9    }
 10 }
Run Code Online (Sandbox Code Playgroud)

问题是:上面的第8行是以下概念的一个例子

  1. 多态性
  2. 聚合
  3. 封装
  4. 抽象化
  5. 遗产

请提供知识来源答案的链接.

PS测试是breinbench上的'OO Concept'.这是免费的.

更新:

从保护多态性的答案之一

"简单来说,多态性是一种类型A能够像其他类型一样出现和使用的能力,B.在强类型语言中,这通常意味着类型A以某种方式从类型B派生,或者类型A实现接口代表B型."

来自维护遗产的维基百科

继承有时也称为泛化,因为is-a 关系表示对象类之间的层次结构.

因此,继承具有另一种视图,即一种称为多态的双重视图,它描述了由共享控制代码控制的许多代码片段.

所以Base = new Derived()显示'是'(继承).其结果是多态性.

所以我怀疑什么是对的?

Bri*_*eil 30

这个问题很容易......这是多态性.

由于继承,完成了多态行为.您可以将Derived实例视为Base,因为Derived继承自Base.当应用于OO语言中的类型时,这是多态性的定义......

http://en.wikipedia.org/wiki/Polymorphism_(computer_science)

[更新,更新]

我希望这是明确的......这些都是说同样的事情的不同方式.

多态性(C#编程指南)

"通过继承,一个类可以用作多种类型;它可以用作自己的类型,任何基类型,或任何接口类型,如果它实现接口.这称为多态."

[更新]

鉴于评论,我将尝试更具体......我不是说因为Derived继承自Base,该行是多态行为的一个例子,我说的是将一个实例赋值给一个类型的变量派生自多变性行为的一个例子.引用我附上的链接的第一句话......

"在计算机科学中,多态性是一种编程语言特性,它允许使用统一的接口处理不同数据类型的值"

这意味着我可以将Derived的实例视为Base的一个实例,它表现出多态行为.这并不依赖于类上虚拟方法的存在.

另一个来自不同来源的引用......

"简单来说,多态性是一种类型A能够像其他类型一样出现和使用的能力,B.在强类型语言中,这通常意味着类型A以某种方式从类型B派生,或者类型A实现接口代表B型."

  • 你不正确...当你为类型的多态行为的基类型的引用分配类型时.它不是多态的继承,它是多态行为的赋值. (12认同)
  • 虚拟方法是大多数人在谈论多态时所想到的,但它们只是多态行为的一个例子.我不是说因为一个类派生自另一个类,这是一个多态行为......我说的是将基类类型的变量赋值给派生类型的实例是一个多态行为.如果你看一下定义(包括链接)我认为你会同意. (4认同)
  • 它不是多态,因为突出显示的代码不使用任何多态特征.仅仅因为你从Base派生并不会使你的类具有多态性. (3认同)
  • 整个讨论归结为一方认为它是多态的,如果它看起来像一只鸭子.另一方认为它不仅需要看起来像鸭子,它需要表现得像鸭子.现在我知道做鸭子了.一个木制的诱饵,无论画得多好,都不是鸭子.由于测试问题中的对象,在所提供的语言中,如果没有虚拟方法,它就不能像鸭子一样,它不是没有鸭子.鸭子说.Finito和所有人的晚安! (2认同)
  • 真的......还在吗?引号可以继续......几乎任何地方的每个实际定义都表明多态性适合将一种类型分配给另一种类型,以便将其视为另一种类型.虚方法是多态的工具而不是它的定义!说真的,读一本书,一篇文章,这是我发布的众多链接之一. (2认同)

Duc*_*uck 14

真正的答案是:一个形成不良,因此毫无意义的问题.

这被认为是一个标准化的多项选择题,但是你有多年经验的人没有达成共识.应该达成的唯一结论是,作为对知识的衡量,它是无用的.


Meh*_*ari 7

这个片段是关于继承的

概念的粗略总结

抽象是关于在对象方面建模现实世界概念而不是考虑函数调用或其他东西的整个想法.它基本上将对象视为单独的实体.

封装是将对象的实现隐藏在明确定义的接口背后的外部世界中的行为.

继承是派生类和基类之间的关系以及概念的分类.它定义了太多实体之间的"is-a"关系,增加了在期望基数的情况下使用派生类的能力.

多态性意味着两个对象在界面上相似但行为方式不同(想想virtual方法).

聚合定义了两个概念之间的"has-a"关系.表示对象由另一个实体组成.

  • @ d30boy:争论这个问题毫无意义.这根本不重要.面向对象编程是一个统一的概念.在没有任何交叉点的情况下分离其组件是不可接受的.无论如何,虽然我相信我在这个选择上非常正确,但我可能错了.所以,我会坚持自己的选择,直到有人能说服我. (2认同)

Joh*_*McG 7

我认为答案的多样性表明这是一个构造不良的问题.

如果你把枪放在我的头上,我可能会选择继承,因为这个模型,因为Derived继承Base,然后Derived可以在需要Base的地方使用(例如被Base*指向),但我可以想象一个保护任何答案.

如果我正在做出招聘决定,我会更倾向于听听候选人如何为自己选择的答案辩护,而不是选择哪一个.但是,使用这样的测试的公司可能不是,或者没有任何人能够评估该级别的技能.


Sim*_*bbs 5

我已经说过多态性,因为这些类型可以相互分配,并且可以被视为它们是相同的.您正在使用父接口来处理子类型的实例.

继承更多地是从父到子(也就是从基础到派生,从超级到子,从抽象到具体)继承成员和/或成员实现.

我将虚拟函数的解析看作具体实现作为多态的一个特征,因此不会因示例中缺少虚函数解析而推迟.