我发现关于多态性和重载有很多定义。有人说重载是多态的一种。虽然有些人说他们不一样。因为重载时只会分配一个函数。而多态性需要为每个重新定义的成员函数分配内存。我真的对此感到困惑,任何人都可以为我解释一下吗?此外,重载是否发生在编译时,而多态性发生在运行时?
8 回答
多态性是为同名的函数/方法定义多个主体的过程。
重载是一种多态性,其中签名部分必须不同。覆盖是另一个,用于签名部分也相同的继承情况。
不,多态性发生在运行时是不正确的。运行时发生的事情称为运行时多态性。这是virtual
在 C++ 中使用关键字实现的。
希望它有帮助..
多态性是面向对象编程的基础,重载是实现多态性的一种方式,特别是在涉及运算符时。更一般地说,当涉及两个或多个类时,谈论多态性。虽然重载也可以在同一个类中进行,但我们可以用多个签名(不同的参数列表)重载方法的名称。而重写是专门为涉及两个或多个类而设计的。请注意,被覆盖的方法具有所有相同的签名。
这是 Bjarne Stroustrup 在他的书中所说的,多态性是一种以多种形式起作用的单一事物(即)以具有不同参数的多种形式起作用的单一函数。因为在 c++ 中构造函数名称必须与类名相同,所以不能有不同名称的不同构造函数。所以要克服功能重载来了。许多人混淆了函数重载是一种多态性。它们都处于不同的末端,它们不能捆绑在一起。
您无法确定一个方法是多态方法,还是仅仅基于其签名的重写方法。您需要查看该方法是如何被调用的。
以下是一些示例代码,可能有助于阐明答案:
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
多态性基于以下两个概念:
- 重载(编译时多态):方法同名但操作不同
- 覆盖(运行时多态性):通过在派生类中创建类似的方法来覆盖基类中的方法
-更正了解释 Shyam Kodase
函数重载发生在具有相同名称但具有不同参数的函数中。
在多态中,具有相同名称的函数是根据其对象来选择的。
The word itself exlains the clear meaning. 'Poly' means multiple, while 'morphism' (used in image technology) means the process of gradual change from one form to another. Thus, same thing will have different forms. Technically, Polymorphism is way of implementing 'Single Interface (Skeleton or structure) multiple Implementation (content or body)'. Polymorphism is a general term which refers to both overloading and overriding. Overloading is done in same class where the functions or methods with the same name have different signatures (argument list or return type) while overriding comes in picture in case of inheritance where a function interface, in the Super class, has similar interface in the subclass and has different implementation than the one in super class. The Super class and sub class form a hierarchy moving from lesser specialization to greater specialization and this should always be remembered while implementing overriding of functions.
重载只是一种提供多种方式来调用具有默认值、更少参数等的相同方法/函数/构造函数的方法。
多态性是关于对象继承、子类等。