多态的概念和意义

  • 函数重写回顾
  1. 父类中被重写的函数依然会继承给子类
  2. 子类中重写的函数将覆盖父类中的函数
  3. 通过作用域分辨符(::)可以访问父类中的函数
Chidl c;
Parent*p = &c;
c.Parent::print();  //在父类中继承
c.print();          //在子类中重写
p->print();         //父类中定义
  • 面向对象中期望的行为?
    根据实际的对象类型判断如何调用重写函数,父类指针(引用)指向父类对象则调用父类中定义的函数,如果指向子类对象则调用子类中定义的重写函数。
  • 面向对象中多态的概念?
    根据实际的对象类型决定函数调用的具体目标,同样的语句在实际运行时有多重不同的表现形态
  • C++语言支持多态的概念
  1. 通过使用virtual关键字对多态进行支持
  2. 被virtual声明的函数被重写后具有多态特性
  3. 被virtual声明的函数叫做虚函数
  • 实验
#include <iostream>
#include <string>
using namespace std;
class Parent
{
public:
    virtual void printf()
    {
        cout << "I'm Parent" << endl;
    }
};
class Child :public Parent
{
public:
    void printf()
    {
        cout << "I'm Child" << endl;
    }
};
void How_to_printf(Parent*p)
{
    p->printf();
}
int main()
{
    Child c;
    Parent p;
    How_to_printf(&c);
    How_to_printf(&p);  
}
  • 运行结果
I'm Child
I'm Parent
  • 多态的意义
  1. 在程序运行过程中展现出动态的特性
  2. 函数重写必须多态实现,否则没有意义
  3. 多态是面向对象组件化程序设计的基础特性
  • 理论中的概念
  1. 静态联编:在程序的编译期间就能确定具体的函数调用,如函数重载。
  2. 动态联编:在程序实际运行后才能确定具体的函数调用,如函数重写。
  • 小结
  1. 函数重写只可能发生在父类和子类之间
  2. 根据实际对象的类型确定调用具体的函数
  3. virtual关键字是C++中支持多态的唯一方式
  4. 被重写的虚函数可以表现出多态的特性
posted @ 2020-02-01 13:07  认真做个普通人  阅读(1767)  评论(0编辑  收藏  举报