【说明:部分笔记图片copy自其他博客资料,此笔记只是个人学习总结,或许有错】
多态
父子,父类函数,子类函数再次实现自己的
然后声明一个父类指针,存储子类的地址
当这个指针调用父类的函数时,他会根据存储地址-子类的不同进行选择调用哪个子类的具体函数
注意:
父类在声明这个函数时,要加Virtual
否则,这个指针就会调用父类的函数,不会选择性的调用子类函数-也就是只读指针内容,不去分辨指针内容的类型
eg1:
说明:
导致错误输出的原因是,调用函数 area() 被编译器设置为基类中的版本,这就是所谓的静态多态,或静态链接 - 函数调用在程序执行前就准备好了。有时候这也被称为早绑定,因为 area() 函数在程序编译期间就已经设置好了。
eg2:
说明:
此时,编译器看的是指针的内容,而不是它的类型。因此,由于 tri 和 rec 类的对象的地址存储在 *shape 中,所以会调用各自的 area() 函数。
正如您所看到的,每个子类都有一个函数 area() 的独立实现。这就是多态的一般使用方式。有了多态,您可以有多个不同的类,都带有同一个名称但具有不同实现的函数,函数的参数甚至可以是相同的。
Ps:
声明了virtual就是动态函数,没声明那就是静态函数
eg3:
eg4:
对比 重载
一个类声明了多个函数,名字一样,但是参数却不同-可以理解为多种形态
当调用这个函数时,编译器会根据参数的类型选择调用 这个函数的对应形态
eg5:
对比函数的覆盖和隐藏
eg6:对比 重写 和 重定义
注意:在 C++ 中若基类中有一个函数名被重载,在子类中重定义该函数,则基类的所有 版本将被隐藏——即子类只能用子类定义的,基类的不再可用。——名字隐藏特性。