Java 为什么不创建派生类而不是基类的动态指针?

Java 为什么不创建派生类而不是基类的动态指针?,java,c++,polymorphism,Java,C++,Polymorphism,如果类如上所述,那么我主要为什么要创建下面提到的类 1) horse*temp=新飞马座 相反,我将创建 2) pegasus*temp=新的pegasus 在第二种方法中,我可以访问horse和bird的函数,所有函数包括非虚拟函数,在第一种方法中,我不能访问pegasus对象的非虚拟函数。当您需要像对待马一样对待pegasus对象时,使用第一种方法,假装你不知道它也是一只鸟。只要您能做到这一点,您就应该这样做,因为它允许您在不更改任何其他内容的情况下更改实现类。这称为接口编程 当您需要同时使

如果类如上所述,那么我主要为什么要创建下面提到的类

1)
horse*temp=新飞马座

相反,我将创建

2)
pegasus*temp=新的pegasus


在第二种方法中,我可以访问horse和bird的函数,所有函数包括非虚拟函数,在第一种方法中,我不能访问pegasus对象的非虚拟函数。

当您需要像对待
马一样对待
pegasus
对象时,使用第一种方法,假装你不知道它也是一只鸟。只要您能做到这一点,您就应该这样做,因为它允许您在不更改任何其他内容的情况下更改实现类。这称为接口编程


当您需要同时使用
pegasus
对象的
horse
bird
方面时,可以使用第二种方法。这对可以分配给
tmp
的对象施加了更严格的约束,因为它必须提供这两个类的实现。

在(1)中,编译器知道你有一匹马,但不知道它实际上是一匹pegasys马,所以它只允许你做马的事情。在(2)中,编译器知道你有一个pegasys,所以你可以做pagasys的事情。问题是什么?为什么这个标签是Java?在Java中,著名的例子是
List List=new ArrayList()
——问题是为什么不将变量类型声明为
ArrayList
。我的意见是,它确实应该是
ArrayList
class horse{/*some data and functions*/}
class bird{/*some data and functions*/}
class pegasus : public horse, public bird
{}