多态和重载之间的区别

时间:2014-04-05 21:55:09

标签: c++ parametric-polymorphism

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

8 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

您无法确定方法是多态方法,还是仅仅基于其签名的重写方法。您需要了解如何调用该方法。

以下是一些示例代码,可能有助于阐明答案:

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

答案 2 :(得分:0)

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

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

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

希望它有所帮助......

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

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

- 修正了解释 Shyam Kodase

答案 5 :(得分:0)

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

答案 6 :(得分:0)

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

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

答案 7 :(得分:-1)

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

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