小弟刚从C++转java,有个问题不明白,下面代码为什么调用了A::print?A和B中的print函数是重载关系?import java.io.*;
import java.util.*;public class class1{
public static void main(String[] args)throws Exception{
B b=new B();
b.print(5);
}
}class A{
public void print(int i){
System.out.println("A::print(int i)");
}
}class B extends A{
public void print(double i){
System.out.println("B::print(double i)");
}
}附上类似的C++代码,结果和java不一样。#include<iostream>
using namespace std;class A{
public:
void print(int i){
cout<<"A::print(int i)"<<endl;;
}
};class B :public A{
public:
void print(double i){
cout<<"B::print(double i)"<<endl;
}
};int main(){
B* pb = new B();
pb->print(5);//class B的print将class A的print隐藏起来
}

解决方案 »

  1.   

    B extends A。因为父类A中也有同名方法,虽然B类中重写了父类的方法,但是程序执行的时候还是先去调用了父类的同名方法。
      

  2.   

    参数类型不一样,不可能重写吧(在C++里是不可能的,所以我的C++例子里都没把它们实现为virtual函数)
      

  3.   

    这是方法重载, 类B继承类A, 那么类B就相当于拥有了A中所有的方法. 
    方法名一样, 参数类型或者个数不一样, 叫做方法重载; 
    方法名一样,类型个数类型都一样,叫做方法覆盖或者叫做重写.java例中, 传入的参数是5 ,是整型, 所以会调用print(int) 这个方法
      

  4.   

    C++中函数重载要有2个条件
    1)函数名一样,参数不同
    2)在同一个域中
    比如我例子中C++里的两个print函数一个在class A域,一个在 class B域,所以在C++里就不是重载。在java里,这样也算重载?
      

  5.   

    求C++和java都会的大侠说说这两个例子的差别。
      

  6.   

    c++ override 好像只要同名就不行了吧?只能这么搞
    pb->A::print(5);
      

  7.   

    C++这里输出的是"B::print(double i)",因为B中的print隐藏了A中的同名函数。
      

  8.   

    這裡的“隱藏”和“覆蓋”(override)本質上是同一概念?
      

  9.   

    因為java中本身就具有隱藏和覆蓋兩個不同的概念隱藏 shadowking 当子类属性与父类属性重叠时
    覆蓋 overriding 
    還有hiding和obscuring但感覺本質差不多,只是適用對象有些區別,c++中的所謂隱藏它的條件貌似更寬鬆,只要方法同名即可達成,返回類型可能也要求的
      

  10.   

    1.shadowing 指属性的隐藏
    2.overriding 指实例方法的覆盖,运行时可发生多态
    3.hiding 指静态方法的覆盖,无多态
    4.obscuring 是自定义变量名与系统中已存在类型重叠时
      

  11.   

    我想知道java中函数重载的严格要求是什么?
    C++中函数重载必定要求在同一个域中(java没有此要求?)
      

  12.   

    我對所謂的域其實也不是很關心,想想爲什麽要同一個域,不同的域即使一摸一樣的方法都可以存在,就無所謂區別重載不重載了不是嗎,這一點任何語言我想都不會有區別。
    關鍵我覺得理解重載是什麽,這個我想不管是c++還是java應該是大同小異的
    允許同名不同參數列表的方法在同一個域中同時存在,是這種概念吧?
      

  13.   

    我是想问java中“函数重载”的概念和C++中“函数重载”概念的区别。
    这个问题涉及到两个子问题:
    (1)java中“函数重载”
    (2)C++中“函数重载”
    其中(1)我很明白,(2)莫名其妙。
      

  14.   

    領域是什麽?可不可以理解為共存的空間?那麼在java中雖然是不同類中定義的方法,但它們是可能被置於同一領域內的,就像父類的方法和子類的方法都會被置於子類的領域內一樣,這不就構成了同域的條件了嗎,非得字面上理解為兩個類域內嗎
      

  15.   

    我是想问java中“函数重载”的概念和C++中“函数重载”概念的区别。
    这个问题涉及到两个子问题:
    (1)java中“函数重载”
    (2)C++中“函数重载”
    其中(2)我很明白,(1)莫名其妙。
      

  16.   

    import java.io.*;
    import java.util.*;public class class1{
        public static void main(String[] args)throws Exception{
            B b=new B();
            b.print(5);
        }
    }class A{
        public void print(int i){
            System.out.println("A::print(int i)");
        }
    }class B extends A{
        public void print(double i){
            System.out.println("B::print(double i)");
        }    
    }
    注意了。A中的方法是print(int i),B中的方法是print(double i) 参数不一样不是重载。
    你在main函数中调用b.print(5),你传入的是int参数,所以调用A中的函数,如果改成b.print(5.0)那么参数就是double类型了,这时就调用B中的函数。
      

  17.   

    領域在C++里也是个泛泛的概念,不同类可以认为在不同域中,不同的namespace也认为在不同域中。
      

  18.   

    那c++也不是很瞭解,是不是可以這樣猜測一下,通過樓主給出的例子,c++對覆蓋達成的條件與java不同,只要方法同名就構成覆蓋,因此繼承的子類中不可能出現能與父類構成重載的方法(有也直接被覆蓋或稱為隱藏),這也可能就是兩者對重載發生範圍即同域定義的些許差別
      

  19.   

    也许是这样,但java是在c++之后才出来的,没事去改“重载”的概念一定有什么深刻的含义。java这么改有什么好处呢?
      

  20.   

    c++中覆盖和隐藏完全是两个概念了: 不要混淆了:
      覆盖 : 利用了虚函数表来完全取代从父类那里继承过来的虚函数  即把虚函数表中的父类得函数指针替换成子类中用来完成覆盖的新的同名函数指针 且无论子类函数是否指定virtual  子类中的用来覆盖的函数都被处理成虚函数。即利用虚函数表事先多态
      隐藏:  子类中的和父类中的同名函数 因为子类中函数重新编写隐藏掉了父类得函数。类似于重载  覆盖要函数名 返回值  参数类型 参数个数完全相同 、  隐藏 只要求函数名相同即可 
      覆盖用来实现多态    而隐藏 一般是用来重载 实现函数的多元化功能
      

  21.   

    正好在转c++,概念不牢固去查了下书,确认规则静态编联
    同名成员会把基类的给覆盖掉。要使用基类的话格式是obj.Base::f()动态编联
    函数名 参数列表 返回值完全一样。基类有virturl。