多态性与继承性作为oop的支柱

时间:2016-07-12 13:31:13

标签: oop inheritance polymorphism

如上所述

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

并且作为许多求职面试中的正确答案 - 该问题的一般正确答案: “OOP的四大支柱是什么?”是:

  1. 抽象

  2. 封装

  3. 继承

  4. 多态性

  5. 我无法理解的是多态性中没有包含继承?

    换句话说,如何在不使用继承的情况下使用多态?

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

    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
    

    正如我所看到的,多态性带来了继承。

    请解释为什么它是独特的 - 或者为什么不能将遗产作为其自身的关键支柱而被丢弃。我们可以使用多态性。

3 个答案:

答案 0 :(得分:1)

据我了解这两个概念:

<强>继承

您可以在不使用polymorphisim的情况下使用继承。例如:

<form name ="frm" action="upload.php" method="post" enctype="multipart/form-          data">
Select image to upload:
<input type="file" name="photoname" id="photoname">
<input type="submit" value="Upload Image" name="submit"      onclick="window.opener.frm.photoname.value=document.frm.photoname.value">
    </form>

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

<强>多态性

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

编写模板方法在技术上是一种多形态,并且函数会重载另一种。作为一个概念,你可以说许多其他事情是实现多态性的方法。

例如:

class Base {
public:
  void foo();
};

class Derived : public Base {
};

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

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

请参阅:https://stackoverflow.com/a/10556406/1230538,以便对其他人的解释进行非常好的解释。

<强>摘要

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

答案 1 :(得分:1)

  

我无法理解的是如何不包含遗传   多态性?

     

换句话说,如何在不使用多态的情况下使用   传承?

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

  1. Ad-hoc多态:这通常称为函数/方法重载,其中多个函数可以共享相同的名称但具有不同的签名。返回类型是否是签名的一部分取决于语言。

  2. 参数化多态:在OOP中,这通常称为泛型,其中函数/方法可以使用多种具体类型,并返回多种具体类型,从而提供编译时安全性。

  3. 子类型多态性:这是我认为大多数人在谈论多态时所想到的。如您所知,这是在子类型提供其父函数/方法的不同实现时。

  4. 您可以在维基百科文章中详细了解不同类型的多态性:https://en.wikipedia.org/wiki/Polymorphism_(computer_science)

答案 2 :(得分:-1)

没有继承的多态性:

<div class="box">
  <p class="text-container" data-short-version="Rudolf E. Raspe" data-long-version="Rudolf Erich Raspe"></p>
  <p class="text-container" data-short-version="Baron Munchausen" data-long-version="Hieronymus Karl Friedrich von Munchhausen"></p>
</div>

.text-container:before {
  content:attr(data-short-version);}

.text-container {  width: 100%;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  font-size:40px;
  margin:0px;}

@media screen and (min-width:600px) {
  .text-container:before {
    content:attr(data-long-version);
  }
}

两个实例都有相同的方法。所以它们是多态的。但是,该方法做了不同的事情,因为对象毕竟是不同的。