【问题标题】:difference between polymorphism and overloading多态性和重载的区别
【发布时间】:2014-04-05 21:55:09
【问题描述】:

我发现有很多关于多态性和重载的定义。有人说重载是多态的一种。虽然有些人说他们不一样。因为重载时只会分配一个函数。而多态性需要为每个重新定义的成员函数分配内存。我真的对此感到困惑,任何人都可以为我解释一下吗? 另外,重载是否发生在编译时,而多态性发生在运行时?

【问题讨论】:

  • 重载是一种多态性。而且重载与多态不同。没事儿。记忆与这两个概念都无关。
  • Polymorphism in c++ 的可能重复项

标签: c++ parametric-polymorphism


【解决方案1】:

多态是为同名的函数/方法定义多个主体的过程。

重载是一种多态性,其中签名部分必须不同。覆盖是另一个,用于签名部分也相同的继承情况。

不,多态性发生在运行时不是真的。运行时发生的事情称为运行时多态性。这是在 C++ 中使用 virtual 关键字实现的。

希望对您有所帮助..

【讨论】:

  • 非常感谢。这真的让我感到困惑:)
  • 在答案中添加了信息以进一步澄清...... :)
  • 其实原版更好。我不得不删除我的 +1。
【解决方案2】:

多态性是OOP的基础,重载是实现多态性的一种方式,特别是涉及到操作符的时候。更一般地说,当涉及两个或多个类时,谈论多态性。虽然重载也可以在同一个类中进行,但我们可以用多个签名(不同的参数列表)重载方法的名称。而重写是专门为涉及两个或多个类而设计的。请注意,被覆盖的方法具有所有相同的签名。

【讨论】:

    【解决方案3】:

    这是 Bjarne Stroustrup 在他的书中所说的,多态性是一种以多种形式起作用的单一事物(即)以多种形式具有不同参数的单一函数。因为在 C++ 中构造函数名称必须与类名相同,所以不能有不同名称的不同构造函数。所以要克服功能重载来了。许多人混淆了函数重载是一种多态性。它们都处于不同的末端,它们不能捆绑在一起。

    【讨论】:

    • 是的,甚至 Bjarne Stroustrup 都提到函数重载与多态性无关
    【解决方案4】:

    您无法确定一个方法是多态方法,还是仅基于其签名的重写方法。你需要看看方法是如何被调用的。

    这里有一些示例代码可能有助于阐明答案:

    public class parentClass {
      //Overridden method
       public void disp()
       {
        System.out.println("Output:  disp() method of parent class");
       }    
    }
    
    public class childClass extends parentClass {
    
       //You cannot determine whether these methods are polymorphic 
       //or static polymorphic (aka overridden) simply by their signatures.                
       //It is by the way they are invoked which determines this.
       public void disp(){
           System.out.println("    Output: disp() method of Child class");
       }
    
       public long add(long a, long b){
           return a + b;   
       }
       public int add(int a, int b){
           return a+b;
       }
       public String add(String a, String b){
           return a + b;
       }
    
       public static void main( String args[]) {
    
            //Here a child class has overridden the disp() method of the
            //parent class.  When a child class reference refers to the child
            //class overriding method this is known as static polymorphism
            //or more simply, overriding.
           System.out.println("childClass referencing the childClass's overridden, or static polymorphic method");
            childClass myChildObj = new childClass();
            myChildObj.disp();
    
            //Another example of static polymorphic, or overridden methods
            System.out.println("The following are overridden, or static polymorphic methods:");         
            System.out.printf("    Long add()override method results:  %d \n",    
                myChildObj.add(5999999, 1));
            System.out.printf("    Integer add() override method results: %d \n",  myChildObj.add(3,2));
            System.out.printf("    String add() override method results: %s \n", 
                myChildObj.add("    First and ...", " Second"));
    
    
            //When the parent class reference refers to the child class object
            //then the overriding method  is called.
            //This is called dynamic method dispatch and runtime polymorphism
            System.out.println("True polymorphism, when the parent class object calls the child class's method:");
            parentClass myParentObj = new childClass();
            myParentObj.disp();
    
       }
    }
    

    预期输出:

    childClass 引用 childClass 的重写或静态多态方法

    Output: disp() method of Child class
    

    以下是重写的或静态多态方法:

    Long add()override method results:  6000000 
    
    Integer add() override method results: 5  
    
    String add() override method results:     First and ... Second 
    

    真正多态的一个例子,当父类对象调用子类的方法时:

    Output: disp() method of Child class
    

    【讨论】:

      【解决方案5】:

      这个词本身解释了明确的含义。 “聚”是指多重,而“态射”(用于图像技术)是指从一种形式逐渐变化到另一种形式的过程。因此,同样的事物会有不同的形式。 从技术上讲,多态是实现“单一接口(骨架或结构)多个实现(内容或主体)”的方式。多态性是一个通用术语,指的是重载和覆盖。重载在同一个类中完成,其中具有相同名称的函数或方法具有不同的签名(参数列表或返回类型),而在继承的情况下,超类中的函数接口在子类中具有相似的接口。并且与超类中的实现不同。 超类和子类形成了一个层次结构,从低专业化到高专业化,在实现函数覆盖时应始终记住这一点。

      【讨论】:

        【解决方案6】:

        函数重载发生在具有相同名称但具有不同参数的函数。

        在多态中,具有相同名称的函数是根据其对象来选择的。

        【讨论】:

        • 您可以通过一些示例更好地阐明您的答案
        【解决方案7】:

        多态性基于以下两个概念:

        • 重载(编译-时间多态性):方法同名但操作不同
        • Overriding(Run-Time 多态性):通过在派生类中创建类似方法来覆盖基类中的方法

        -更正了解释 夏姆小田濑

        【讨论】:

          【解决方案8】:

          重载只是一种提供多种方式来调用具有默认值、更少参数等的相同方法/函数/构造函数的方法。

          多态是关于对象继承、子类等。

          【讨论】:

          • 感谢您对他们两个的定义:)
          • @user3500089 请注意,在 C++ 中,多态性不仅限于对象继承、子类等。它包括函数和运算符重载,以及通过模板实现的其他编译时多态性。
          猜你喜欢
          • 2016-09-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-01-02
          • 2019-11-07
          • 2010-09-12
          • 1970-01-01
          相关资源
          最近更新 更多