多态(Polymorphism)
多种形态,在面向对象编程中,指的是同一个接口或调用形势,具有多种不同的实现
C++中,多态是通过虚函数(virtual Function)实现的
向上转型(即子类向父类转型)是支持的,向下转型是错误的,也是没意义的
注意: 方法重写(虚函数),同名覆盖(非虚函数),方法重载(参数或const不同)的区别
用父类引用或父类指针指向子类对象,并且通过这个引用或指针去调用父类中的某个虚函数时,如果子类中重写了该虚函数,那么调用的将是子类中的虚函数,否则调用的僵尸父类中的虚函数。
如果将父类中某个方法定义为虚函数,那么它的所以子类(包括直接、间接子类)中定义的和这个虚函数同名的函数都将自动为虚函数(即使不使用virtual关键字,但为了代码可读性更高,建议写上virtual关键字)
纯虚函数(Pure Virtual Function):只有方法签名,没有实现
抽象类(Abstract Class):含有纯虚函数的类,它不能被实例化,天生是用来作为父类使用的。
如果一个类的父类为抽象类,并且它没有将父类中的所有纯虚函数重写,那么它也是抽象类,不能被实例化
class person
{
private:
int id;
char name[20];
public:
virtual void speak() //虚函数
{
cout<<"i can speak!"<<endl;
}
virtual void sleep () = 0; //纯虚函数
};
class chinese:public person
{
private:
bool taijian;
public:
//方法重写 (或重新实现,Overwrite)
virtual void speak() //虚函数 子类改重写此函数,调用就会调用子类中的函数,否则会调用父类的函数
{
cout<<"我讲国语!"<<endl;
}
};
class english : public person
{
};
int main()
{
chinese c1;
c1.speak();
person p1;
p1 = c1; // 向上转型 ,正确
//c1 = p1; // 向下转型,错误
person* p2 = NULL;
p2 = &c1 ; // 向上转型
person& p3 = c1; //向上转型
return 0;
}
1 #include<iostream>
2 #include<string>
3 using namespace std;
4
5 class usb
6 {
7 private:
8 int id;
9 string name;
10 public:
11 virtual void driver()= 0;
12
13 };
14
15 class logit:public usb
16 {
17 public:
18 virtual void driver()
19 {
20 cout<<"罗技鼠标"<<endl;
21 }
22 };
23
24 class lenovo : public usb
25 {
26 public:
27 virtual void driver()
28 {
29 cout<<"联想鼠标"<<endl;
30
31 }
32
33 };
34
35 void do_mouse(usb& dev)
36 {
37 dev.driver();
38 }
39
40 int main()
41 {
42 logit lo;
43 lenovo le;
44
45 do_mouse(lo);
46 do_moude(le);
47 return 0;
48 }