多态,字面理解就是一个事物的多种形态。实际上是:不同的事物对同一行为做出的不同的反应。
C++中的多态:由继承而产生的相关的不同的类, 其对象对同一消息会作出不同的响应。
多态性是面向对象程序设计的一个重要特征, 能增加程序的灵活性。 可以减轻系统升级,维护,调试的工作量和复杂度。
1、赋值兼容 Assign Compatible
在需要基类对象的任何地方, 都可以使用公有派生类的对象来替代。只有在公有派生类中才有赋值兼容, 赋值兼容是一种默认行为, 不需要任何的显示的转化步骤。
三种:only three!
1、派生类的对象可以赋值给基类对象。
2 、派生类的对象可以初始化基类的引用。
3 、派生类对象的地址可以赋给指向基类的指针。
2、多态
静多态:
静多态:通过命名倾轧在编译阶段实现
(1)func(int a, int b) -->func_i_i
(2)func(float ,double d) -->func_f_d
(动)多态
多态实现条件:
(1)父类中有虚函数
(2)子类中覆写(override)了父类的虚函数
(3)将子类对象地址赋给父类的指针 并发生虚函数调用。
注意:
1、声明虚函数的方法:在前边加 virtual 构成虚函数。声明时加,后边用到不用加。
2、 覆写的函数,不一定同父类的访问方式(公有、私有、保护)一致。。看子类需求自定!
3、三者区别:
覆写(override) | 发生在父子类中。父类中函数有虚函数声明,子类中,同参、同名、同返回 的函数之间构成覆写 |
重载 (overload) | 同一作用域,函数名相同,参数列表不同 |
shadow | 发生在父子类之间的同名成员(只看名字,不看参数) |
2.1虚函数与多态
(1)virtual是声明虚函数的关键字,virtual void function();
(2)虚函数在派生类中仍为虚函数。
(3)覆写条件:发生在父子类的继承关系中,且函数 同参、同名、同返回值。
(4)子类中的覆写函数,可以是任意类型的访问方式(公有、私有、保护),看子类自己需求规定。
2.2纯虚函数与多态
纯虚函数, 是一类没有实现体, 且被"初始化"为零的函数。 格式: virtual void draw() = 0;
注意:
(1)纯虚函数只有声明,没有实现。 virtual void draw() = 0;被初始化为0。
(2)含有纯虚函数的类,称为“Abstract Base Class”(抽象基类)。抽象基类不可实例化,也就是不能定义类对象。其存在的意义就是被继承,提供族类的公共接口。
(3)如果一个基类中声明了纯虚函数,此基类就是抽象基类。派生类中如果没有该函数的定义,那么在该派生类中仍为纯虚函数,则该派生类也是纯虚基类。(也就是说:A含有纯虚函数是抽象基类,B继承A,如果B中没有纯虚函数的定义,那么B也不能定义对象。)
2.3虚析构
含有虚函数的类, 析构函数也应该声明为虚函数, 称为虚析构函数。
在 delete 父类指针, 指向的堆上子类对象时, 会调用子类的析构函数, 实现完整析构。
堆中 含有虚函数的时候,将其析构函数一并置为 virtual ~Dog();栈中自处理,没这么多事。
记住含虚函数的析构的时候 加个 virtual ~ 就完事了。
Animal();
virtual ~Animal();