为什么JAVA里没有virtual关键字可以实现类的虚态?这样做的理由是什么?有什么好处?
C++要是没有virtual关键字的话就算是重载函数了~========================================================class CAnimal
{
public:
virtual void display() //请注意这里,要是没加virtual关键子,打印出来的结果就是3个Animal了~~~~~~~~~~
{
printf("Animal\n");
}
};
class CCat:public CAnimal
{
public:
void display()
{
printf("Cat\n");
}
};
class CPuma:public CCat
{
public:
void display()
{
printf("Puma\n");
}
};
class CDog:public CAnimal
{
public:
void display()
{
printf("Dog\n");
}
};int main(int argc, char *argv[])
{
CCat cat;
CPuma puma;
CDog dog;
CAnimal *pAnimal[3]={&cat,&puma,&dog};
for(int i=0;i<3;i++)
{
pAnimal[i]->display();
}
system("PAUSE");
return 0;
}==========下面的JAVA代码等同于上面的C++================
class CAnimal
{
public void display() //请注意,这里根本没有virtual,是不是JAVA里的类默认可以实现虚函数,而不需要加virtual,为什么JAVA要这样设计呢?有什么理由呢?又有什么好处呢?
{
System.out.println("Animal");
}
};
class CCat extends CAnimal
{
public void display()
{
System.out.println("Cat");
}
};
class CPuma extends CCat
{
public void display()
{
System.out.println("Puma");
}
};
class CDog extends CAnimal
{
public void display()
{
System.out.println("Dog");
}
};public class virtualTest
{
public static void main(String args[])
{
CCat cat=new CCat();
CPuma puma=new CPuma();
CDog dog=new CDog();
CAnimal animal[]=new CAnimal[3];
animal[0]=cat;
animal[1]=puma;
animal[2]=dog;
for(int i=0 ;i<3; i++)
{
animal[i].display();
}
}
}
C++要是没有virtual关键字的话就算是重载函数了~========================================================class CAnimal
{
public:
virtual void display() //请注意这里,要是没加virtual关键子,打印出来的结果就是3个Animal了~~~~~~~~~~
{
printf("Animal\n");
}
};
class CCat:public CAnimal
{
public:
void display()
{
printf("Cat\n");
}
};
class CPuma:public CCat
{
public:
void display()
{
printf("Puma\n");
}
};
class CDog:public CAnimal
{
public:
void display()
{
printf("Dog\n");
}
};int main(int argc, char *argv[])
{
CCat cat;
CPuma puma;
CDog dog;
CAnimal *pAnimal[3]={&cat,&puma,&dog};
for(int i=0;i<3;i++)
{
pAnimal[i]->display();
}
system("PAUSE");
return 0;
}==========下面的JAVA代码等同于上面的C++================
class CAnimal
{
public void display() //请注意,这里根本没有virtual,是不是JAVA里的类默认可以实现虚函数,而不需要加virtual,为什么JAVA要这样设计呢?有什么理由呢?又有什么好处呢?
{
System.out.println("Animal");
}
};
class CCat extends CAnimal
{
public void display()
{
System.out.println("Cat");
}
};
class CPuma extends CCat
{
public void display()
{
System.out.println("Puma");
}
};
class CDog extends CAnimal
{
public void display()
{
System.out.println("Dog");
}
};public class virtualTest
{
public static void main(String args[])
{
CCat cat=new CCat();
CPuma puma=new CPuma();
CDog dog=new CDog();
CAnimal animal[]=new CAnimal[3];
animal[0]=cat;
animal[1]=puma;
animal[2]=dog;
for(int i=0 ;i<3; i++)
{
animal[i].display();
}
}
}
Cat
Puma
Dog
事实上你这个JAVA代码中都没有POLYMORPHISM,只是体现了上溯造型(UPCASTING)而已.
班门弄斧,请勿见笑!
其时一般情况下我们都把类的所有函数声明
为virtual(除开构造函数)
java也就是想通了这点,即干脆将方法默认就
声明为virtual,而至于C++的纯虚函数,java
就用abstract
纯面向对象的语言
liujun999999(减肥中...) 说得好,其他人也不错
两种语言的哲学不同
如果C++直接把所有函数都做成virtual 会损失很多效率,可以去研究一下vptr vtable
其时一般情况下我们都把类的所有函数声明
为virtual(除开构造函数)
java也就是想通了这点,即干脆将方法默认就
声明为virtual,而至于C++的纯虚函数,java
就用abstract
==============================================
c++中把所有函数都声明为virtual的人,不配做一个c++开发人员,开发java最合适了。