10

我知道如何重载方法,以及如何重写方法。但是有可能同时重载和覆盖一个方法吗?如果是,请举个例子。

4

4 回答 4

18

重载和覆盖是互补的东西,重载是指方法名相同但参数不同,而重载是指子类中方法名相同但参数相同。因此,重载和覆盖不可能同时发生,因为重载意味着不同的参数。

例子:

class A {
    public void doSth() { /// }
}

class B extends A {
    public void doSth() { /* method overriden */ }

    public void doSth(String b) { /* method overloaded */ }

}

干杯!

于 2012-05-13T01:58:14.197 回答
6

重载和重载只是抽象。重载只是意味着编译器使用名称以及参数的类型和数量来确定要调用的函数。实际上,重载一个方法与命名它没有什么不同,因为编译器用来查找函数的键是名称和参数列表的组合。

super覆盖是一种相同的原理,除了编译器可以使用关键字来处理覆盖的函数。

那么你能覆盖一个重载的函数吗?是的,因为重载方法在编译器眼中是完全不同的方法。

于 2012-05-13T02:09:00.667 回答
1

这取决于你的意思。方法可以是超类中重载方法的覆盖。并且您可以重载同时使用另一种方法覆盖的方法。

但是,您不能拥有一种既是重载又是覆盖的方法。对于要成为覆盖的方法,具有相同签名的另一个方法必须已经存在于超类中......这意味着该方法不能成为的覆盖。

于 2012-05-13T02:45:17.343 回答
0

是的,有可能,您可以在同一个类中重载和覆盖一个函数,但您不能在两个不同的类中重载一个函数,因为这在逻辑上是不可能的。

#include <bits/stdc++.h>
using namespace std;

class Base {
   public:
    void print() 
    {
        cout << "Base Function" << endl;
    }
    void print(string name) //Overloaded Function
    {
        cout << "Base Function : " <<name<< endl;
    }
};

class Derived : public Base {
   public:
    void print() 
    {
        cout << "Derived Function" << endl;
    }
     void print(string name) //Overloaded Function
    {
        cout << "Derived Function : "<<name<< endl;
    }
};

int main() {
    Derived derived1, derived2;
   
    //accesses the print function in derived class
    derived1.print();
   
    //accesses the overloaded print function in derived class
    derived1.print("Gitanshu");
    
    //accesses the print function in base class
    derived2.Base::print();

    //accesses the overloaded print function in base class
    derived2.Base::print("Gitanshu");

    return 0;
}

输出:

Derived Function
Derived Function : Gitanshu
Base Function
Base Function : Gitanshu

我使用 C++ 回答了这个问题,Java 也是如此。

于 2021-07-05T06:34:36.820 回答