多态性与继承性是oop的支柱

多态性与继承性是oop的支柱,oop,inheritance,polymorphism,Oop,Inheritance,Polymorphism,如前所述 作为许多求职面试的正确答案,这个问题的一般正确答案是: “OOP的四大支柱是什么?”是: 抽象 封装 继承权 多态性 我不明白的是,多态性如何不包含继承 换句话说,如果不使用继承,如何使用多态性 我知道使用多态性的唯一方法是 class A{ virtual void foo(){cout<<"A";} void bar(){cout<<"A";} }; class B : public A{ virtual foo(){cout<

如前所述

作为许多求职面试的正确答案,这个问题的一般正确答案是: “OOP的四大支柱是什么?”是:

  • 抽象

  • 封装

  • 继承权

  • 多态性

  • 我不明白的是,多态性如何不包含继承

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

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

    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
    
    A类{
    
    虚拟void foo(){cout无继承多态性:

    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
    
    A类{
    虚拟void foo(){cout foo();//打印B
    

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

    正如我理解的两个概念:

    继承

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

    class Base {
    public:
      void foo();
    };
    
    class Derived : public Base {
    };
    
    int main() {
      Derived d;
      d.foo();
    }
    
    // This function must be given an object that has a method foo().
    template <typename T> bar(T& t) {
      t.foo();
    }
    
    在这里,我们在所有派生类型中都使用了基类型的公共功能,但在任何时候我们都不做任何polymophic(我们从不通过其基接口查看派生实例)

    多态性

    多态性作为一个概念包含了比最常见的基于标准继承的方法更多的内容。这实际上是子类型,它只是多态性的一种

    从技术上讲,编写模板方法是一种polymophism形式,函数重载则是另一种形式。作为一个概念,您可能会认为许多其他事情都是实现polymophism的方法

    例如:

    class Base {
    public:
      void foo();
    };
    
    class Derived : public Base {
    };
    
    int main() {
      Derived d;
      d.foo();
    }
    
    // This function must be given an object that has a method foo().
    template <typename T> bar(T& t) {
      t.foo();
    }
    
    //必须为该函数指定一个具有方法foo()的对象。
    模板栏(T&T){
    t、 foo();
    }
    
    这是没有继承的多态行为

    请看:其他人对此给出了很好的解释

    摘要

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

    我不明白的是继承是如何不包含在 多态性

    换句话说,如果不使用 继承权

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

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

  • 参数多态性:在OOP中,这更常见于泛型,其中函数/方法可以处理多个具体类型,并返回多个具体类型,从而提供编译时安全性

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


  • 您可以在此处阅读wikipedia文章中有关不同类型多态性的更多信息:

    考虑接口——实现不必在相关类中进行。我认为返回类型可以不同。是的,您是对的。只要参数签名不同,返回类型就可以不同(至少在Java中,不确定其他语言)。我会澄清答案。这不会编译。
    A*b=new b();
    rhs参数的类型是
    b*
    ,而不是
    A*