我正在通过考试并遇到一个问题,我们没有与同事达成协议。
С++
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 };
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 }
问题是:上面第8行是以下oo概念的一个例子
请提供知识来源答案的链接。
P.S。测试是breinbench上的'OO Concept'。它是免费的。
更新:
从保护多态
的答案之一“简单来说,多态性是 一种类型A的能力表现为 B.可以像其他类型一样使用B. 强类型语言,这通常 意味着类型A以某种方式派生自 类型B,或类型A实现 表示类型B的接口。“
来自维护继承的维基百科
有时也会调用继承 泛化,因为是-a 关系代表层次结构 在对象类之间。
和
继承因此有另一个 视图,双重,称为多态, 它描述了许多代码 由共享控制控制 代码。
所以Base = new Derived()
显示'是'(继承)。其结果是多态。
所以我怀疑什么是对的?
答案 0 :(得分:30)
这个问题很容易...... 多态性。
由于继承,完成了多态行为。您可以将Derived实例视为Base,因为Derived继承自Base。当应用于OO语言中的类型时,这是多态性的定义...
http://en.wikipedia.org/wiki/Polymorphism_(computer_science)
[更新,更新]
我希望这已经足够明确了...这些都是说同样话题的不同方式。
Polymorphism (C# Programming Guide)
“通过继承,一个类可以 用作多种类型;有可能 用作自己的类型,任何基类型, 或任何接口类型,如果它实现 接口。这就是所谓的 多态性“。
<强> [更新] 强>
鉴于评论,我将尝试更具体......我不是说因为Derived继承自Base,该行是多态行为的一个例子,我说的是将一个实例赋值给一个变量a它派生的类型是多态行为的一个例子。引用我附上的链接的第一句......
“在计算机科学中,多态性是 一种编程语言功能 允许不同数据类型的值 使用制服处理 接口“
这意味着我可以将Derived的实例视为Base的实例,它表现出多态行为。这并不依赖于类上虚拟方法的存在。
和different source的其他引用......
“简单来说,多态性是 一种类型A的能力表现为 B.可以像其他类型一样使用B. 强类型语言,这通常 意味着类型A以某种方式派生自 类型B,或类型A实现 表示类型B的接口。“
答案 1 :(得分:14)
真正的答案是:形成不良而无意义的问题。
这被认为是一个标准化的多项选择题,但是你有多年经验的人没有达成共识。应该达成的唯一结论是,作为对知识的衡量,它是无用的。
答案 2 :(得分:7)
此代码段大约是Inheritance
抽象是关于根据对象建模现实世界概念而不是考虑函数调用或其他东西的整个想法。它基本上将对象视为单独的实体。
封装是将对象的实现隐藏在定义良好的接口背后的外部世界。
继承是派生类和基类之间的关系以及概念的分类。它定义了太多实体之间的“is-a”关系,增加了在期望基数的情况下使用派生类的能力。
多态性意味着两个对象在界面上相似但行为方式不同(想想virtual
方法)。
聚合定义了两个概念之间的“has-a”关系。表示对象由另一个实体组成。
答案 3 :(得分:7)
我认为答案的多样性表明这是一个构造不良的问题。
如果你把枪放在我头上,我可能会选择继承,因为这个模型因为Derived继承了Base,所以Derived可以在需要Base的地方使用(例如被指向通过基地*)但我可以想象任何答案的辩护。
如果我正在做出招聘决定,我会更倾向于听听候选人如何为自己选择的答案辩护,而不是选择哪一个。但是,使用这样的测试的公司可能不是,或者没有任何人能够评估该级别的技能。
答案 4 :(得分:5)
我已经说过多态性,因为这些类型可以相互分配,并且可以被视为相同。您正在使用父接口来处理子类型的实例。
继承更多地是继承从父到子(也就是从base到派生,从super到sub,从abstract到具体)类的成员和/或成员实现。
我将虚拟函数的解析视为具体实现的多态性特征,因此不会因示例中缺少虚函数解析而推迟。
答案 5 :(得分:4)
答案是多态性。
见http://en.wikipedia.org/wiki/Polymorphism_in_object-oriented_programming
。
这里的许多答案都会丢弃这个答案,因为没有虚函数调用。但这只是一个多态性的例子(也是最常见的)。但那不是唯一的。
最简单的多态性定义很好地总结了维基百科的文章:
简单来说,多态性是 一种类型A的能力表现为 B.可以像其他类型一样使用B. 强类型语言,这通常 意味着类型A以某种方式派生自 类型B,或类型A实现 表示类型B的接口。
当然,第8行是出现的对象的示例,其类型为Base
但实际上属于Derived
答案 6 :(得分:3)
多态性
聚合
封装
<强>抽象强>
继承
修改强>
来自维基百科的抽象简化了复杂性 通过建模类来实现 适合于问题,和 在最合适的水平上工作 对于给定方面的继承 问题。
答案 7 :(得分:3)
6. None of the above.
这是协方差的一个例子
http://en.wikipedia.org/wiki/Covariance_and_contravariance_(computer_science)
另见Liskov可译性原则:
http://en.wikipedia.org/wiki/Liskov_substitution_principle
答案 8 :(得分:2)
我认为这里的简单代码最好描述为子类型(http://en.wikipedia.org/wiki/Subtype)的示例。在面向对象的编程术语中,多态是指子类更改或专门化基类(http://en.wikipedia.org/wiki/Polymorphism_in_object-oriented_programming)中定义的行为的能力。这个例子并没有真正显示出来。
在Brainbench上列出的选项中,我认为继承最简单,因为它最模糊。
答案 9 :(得分:-1)
这不是直接给出的任何选择。
它不是直接关于多态的,因为代码没有通过基指针调用虚方法或删除指向基类的指针。
它不是直接关于继承,因为突出显示的代码不进行任何继承。第2行是关于继承。
它当然不是关于抽象,封装或聚合,因为它不是那些靠近那些东西的。
这个概念最直接地说明是自动演员。