发现一个c++多态与java多态不同的地方

来源:互联网 发布:淘宝秋冬睡衣女套装 编辑:程序博客网 时间:2024/06/03 12:01

刚刚看到一篇文章提出c++多态与java多态不同的地方,基本意思如下:

请看C++代码:

class Base
{
public:
 Base()
 {
  init(); 
 }
 virtual ~Base() {}
protected:
 int value;
 virtual void init() 
 { 
  value = 100;     
 }
};

class Derived : public Base
{
public:
 Derived()
 {
  init();
 }
protected:
 void init() 
 {
  cout << "value = " << value << endl;
  // 做一些额外的初始化工作 
 }
};

int main(int argc, char* argv[])
{
 Base* pb;
 pb = new Derived();
 delete pb;
 return 0;
}

执行结果是

value = 100

 

再看java代码:

class Base
{
  public Base()
  {
    init();
  }
  protected int value;
  protected void init()
  {
         value = 100;  
  }
}

class Derived extends Base
{
  public Derived()
  {
    init();
  }
  protected void init()
  {
    System.out.println("value = " + value);
    // 做一些额外的初始化工作
  }
}

public class Test
{
  public static void main(String[] args)
  {
    Base base = new Derived();
  }
}

执行结果是

value = 0

value = 0

在java中子类的init方法重写了父类的init方法,导致不能正确完成初始化。看到这里我思考了一下,由于子类重写了父类的同名函数,才导致本应该执行的函数没有执行,如果修改父类的初始化函数或者子类的初始化函数,使子类不会发生重写,是不是就不会发生上面的情况?或许即使是子类与父类,当涉及到各自的初始化的地方时就不应该使用多态性。