首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多态性与继承性是面向对象操作的支柱

多态性与继承性是面向对象操作的支柱
EN

Stack Overflow用户
提问于 2016-07-12 13:31:13
回答 3查看 1.2K关注 0票数 3

如前所述

https://standardofnorms.wordpress.com/2012/09/02/4-pillars-of-object-oriented-programming/

在许多求职面试中,正确的答案是:“面向对象的四大支柱是什么?”是:

  1. 抽象化
  2. 封装
  3. 继承
  4. 多态

我不明白的是,遗传是如何不包含在多态性中的?

换句话说,如果不使用继承,如何使用多态性?

我所知道的使用多态性的唯一方法是

代码语言:javascript
复制
class A{
    virtual void foo(){cout<<"A";}
    void bar(){cout<<"A";}
};
class B : public A{
    virtual foo(){cout<<"B";}
};

A* ab = new B();
ab->foo();//prints B, using polymorphism
ab->bar();//prints A, using inheritance

A* a = new A();
a->foo();//prints A
a->bar();//prints A, obviously

在我看来,多态带来了继承。

请解释为什么它是不同的,或者为什么不能放弃继承作为它自己的一个关键支柱。我们可以用多态也可以不用。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-07-12 14:31:54

我不明白的是,遗传是如何不包含在多态性中的? 换句话说,在没有继承的情况下,如何使用多态性?

有三种主要的多态性类型,其中只有一种需要继承才能工作。

  1. Ad多态:这通常称为函数/方法重载,其中多个函数可以共享相同的名称,但有不同的签名。返回类型是否属于签名的一部分取决于语言。
  2. 参数多态:在OOP中,这通常称为泛型,其中一个函数/方法可以处理多个具体类型,并返回多个具体类型,从而提供编译时的安全性。
  3. 亚型多态性:我认为大多数人在谈论多态性时都会想到这一点。正如您所知道的,当子类型提供它们的父函数/方法的不同实现时。

您可以从维基百科的文章中了解更多关于不同类型多态性的信息:science)

票数 2
EN

Stack Overflow用户

发布于 2016-07-12 14:12:44

据我所知,这两个概念:

继承

您可以使用继承而不使用polymorphisim。例如:

代码语言:javascript
复制
class Base {
public:
  void foo();
};

class Derived : public Base {
};

int main() {
  Derived d;
  d.foo();
}

在这里,我们在所有派生类型中使用基本类型的公共功能,但在任何时候我们都不做任何多方面的事情(我们从不通过它的基本接口来查看派生实例)。

多态性

多态作为一个概念包含的不仅仅是标准的基于继承的方法。这实际上是亚型,这只是一种多态性。

从技术上讲,编写模板方法是一种多向性,而函数重载则是另一种形式。作为一个概念,你可以争辩说,许多其他的东西是实现多元主义的方式。

例如:

代码语言:javascript
复制
// This function must be given an object that has a method foo().
template <typename T> bar(T& t) {
  t.foo();
}

这是没有继承的多态行为。

参见:https://stackoverflow.com/a/10556406/1230538对其他人给出的一个很好的解释。

摘要

在大多数现代编程语言中,99%的人使用继承来实现多态性,但它们是不同的概念,可以相互独立地存在/使用。

票数 1
EN

Stack Overflow用户

发布于 2016-07-12 14:12:31

没有继承的多态性:

代码语言:javascript
复制
class A {
    virtual void foo() { cout << "A"; }
};

class B {
    virtual void foo() { cout << "B"; }
};

A* a = new A();
A* b = new B();

a->foo(); // prints A
b->foo(); // prints B

这两个实例都有相同的方法。所以它们是多态的。但是,由于对象毕竟是不同的,所以方法做的事情不一样。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38330357

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档