2016-03-12 49 views
0

我的背景是C++。我知道什麼是重載,什麼是重載。 我想問一下,如果我不想從父類重寫方法,並想使用不同的返回類型和同名方法創建自己的方法,爲什麼java不允許我這樣做?爲什麼返回類型的相同命名方法應該在子類Java中相同?

例子:

class X{ 
    public void k(){ 

    } 
} 
public class Y extends X{ 
    public int k(){ 
     return 0; 
    } 
} 

爲什麼使用Java是這裏將隱藏的概念?意味着Y類應該隱藏X的方法。背後的原因是什麼?

C++應用隱藏的概念。

#include <iostream> 
class A{ 
    public: 
     void k(){ 
      std::cout << "k from A"; 
     } 
}; 
class B:public A{ 
    public: 
     int k(){ 
      std::cout << "k from B"; 
      return 0; 
     } 
}; 
int main(){ 
    B obj; 
    obj.k(); 

    return 0; 
} 
+0

爲什麼你要嗎?例如,你失去了創建虛擬功能的可能性。 – Lasoloz

+0

@Lasoloz爲什麼Java不允許改變返回類型。我知道如果我在C++中聲明函數virual,那麼我需要是相同的返回類型(但爲什麼?)爲什麼返回類型應該是相同的問題? – UnKnown

回答

3

因爲Java中的所有方法都是「虛擬的」(即它們表現出亞型多態性)。重寫虛擬成員函數時,C++也不允許衝突的返回類型。

struct Base { 
    virtual void f() {} 
}; 

struct Derived : Base { 
    int f() override { return 0; } 
}; 

編譯器輸出:

8 : error: conflicting return type specified for 'virtual int Derived::f()' 
int f() { return 0; } 
^ 
3 : error: overriding 'virtual void Base::f()' 
virtual void f() {} 
^ 

請注意,只有衝突的返回類型是不允許的。允許不同的退貨類型,只要它們兼容。例如,在C++:

struct Base { 
    virtual Base* f() { return nullptr; } 
}; 

struct Derived : Base { 
    Derived* f() override { return nullptr; } 
}; 

而且在Java中:

class Base { 
    Base f() { return null; } 
} 

class Derived extends Base { 
    @Override 
    Derived f() { return null; } 
} 
+0

你能給我任何關於java的例子,它可能導致問題嗎? – UnKnown

+0

@UnKnown隱藏通常被認爲是不好的做法,因爲可能會讓期望調用基類函數的類的用戶感到困惑。但是,我意識到我的回答是錯誤的。我用正確的理由更新了它! –

+0

約瑟夫我已經瞭解C++。但是關於Java的是什麼?爲什麼java不允許? – UnKnown

相關問題