多态

什么是多态

多态就是向不同的对象发送同一个消息,不同的对象在接收时会产生不同的行为。也就是说,每个对象可以用自己的方式去响应共同的消息。使用相同的代码实现不同的动作,体现了面向对象编程的优越性

在C++中,多态就是利用基类指针指向子类实例,通过基类指针调用子类(虚)函数从而实现“一个接口,多种形态”的效果。

【多态分为两种】

1、编译时多态:主要通过函数的重载和模板来实现。

2、运行时多态:主要通过虚函数来实现。

1.多态的体现

父类的引用指向自己的子类对象;

父类的引用也可以接收自己的子类对象。

2.多态的前提

必须是类与类之间的关系,要么是继承(extends),要么是实现(implements),通常还有一个前提,就是存在覆盖(重写)。

3.多态的好处

多态的出现大大的提高了程序的可扩展性。但是只能使用父类的引用,访问父类的成员。

4.类型转换(向上转型,向下转型)

1
2
3
4
5
6
7
8
9
10
11
12
13

Anmial a=new Cat();//类型提升,向上转型

Cat c=(Cat)a;//强制将父类的引用转成子类的类型,向下转型


/*
Anmial a=new Anmial();
Cat c=(Cat)a;
此段代码有误;
原因:不能将以前有的东西强制转为现有的东西。
*/

5.多态的应用

instanceof——-一般用于子类的类型有限,当传的类型需要进行其他操作时,必须要确定它的类型,即用到它的特有方法,这时用instaceof进行比较。

多态示例一:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44

abstract class Animal{
public abstract void eat();
}

class Cat extends Animal{
public void eat(){
System.out.println("猫吃鱼");
}
public void catchMouse(){
System.out.println("猫抓老鼠");
}
}

class Dog extends Animal{
public void eat(){
System.out.println("狗吃骨头");
}
public void kanJia(){
System.out.println("狗看家");
}
}

class duotaiDemo{
public static void main(String[] args)
{
funcation(new Dog());
funcation(new Cat());
public static void funcation(Animal a)
{
a.eat();
if(a instanceof Cat)
{
Cat c=(Cat)a;
c.catchMouse();
}else if(a instanceof Dog){
Dog d=(Dog)a;
d.kanJia();
}
}
}

}

输出结果为:

狗吃骨头

狗看家

猫吃鱼

猫抓老鼠