49_多态的概念和意义

1. 多态的概念

面向对象中期望的行为:根据实际的对象类型判断如何调用重写函数

  • 如果父类指针(引用)指向父类对象,则调用父类中定义的函数
  • 如果父类指针(引用)指向子类对象,则调用子类中定义的重写函数

面向对象中多态的概念:根据实际的对象类型决定函数调用的具体目标,同样的调用语句在实际运行时有多种不同的表现形式

C++语言直接支持多态的概念:

  • 通过使用virtual关键字对多态进行支持
  • virtual声明的函数被重写后具有多态特征
  • virtual声明的函数叫做虚函数

编程说明:多态的初探

#include <iostream>
#include <string>

using namespace std;

class Parent
{
public:
    virtual void print()    // add virtual keyword ==> polymorphism
    {
        cout << "I'm Parent." << endl;
    }
};

class Child : public Parent
{
public:
    void print()    
    {
        cout << "I'm Child." << endl;
    }
};

void how_to_print(Parent* p)
{
    p->print();     // 展现多态的行为
}

int main()
{
    Parent p;
    Child c;
    
    how_to_print(&p);   // Expected to print : I'm Parent.
    how_to_print(&c);   // Expected to print : I'm Child.

    return 0;
}

输出结果:

I'm Parent.
I'm Child.

2. 多态的意义

  • 在程序运行过程中展现出动态的特性
  • 函数重写必须多态实现,否则没有意义
  • 多态是面向对象组件化程序设计的基础特性

3. 静态联编(static binding)和动态联编(dynamic binding)

静态联编:在程序的编译期间就能确定具体的函数调用,如函数重载
动态联编:在程序实际运行后才能确定具体的函数调用,如函数重写

编程说明:动态联编和静态联编

#include <iostream>
#include <string>

using namespace std;

class Parent
{
public:
    virtual void func()
    {
        cout << "void func() " << endl;
    }
    
    virtual void func(int i)
    {
        cout << "void func(int i): " << i<< endl;
    }
    
    virtual void func(int i, int j)
    {
        cout << "void func(int i, int j): " << "(" << i << ", " << j << ")" << endl;
    }
};

class Child : public Parent
{
public:
    void func(int i, int j)
    {
        cout << "void func(int i, int j): " << i + j << endl; 
    }
    
    void func(int i, int j, int k)
    {
        cout << "void func(int i, int j, int k): " << i + j + k << endl;
    }
};

void run(Parent* p)
{
    p->func(1, 2);  // dynamic binding  
}


int main()
{
    Parent p;
    
    p.func();       // static binding
    p.func(1);      // static binding
    p.func(1, 2);   // static binding
    
    cout << endl;
    
    Child c;
    
    c.func(1, 2);   // static binding
    
    cout << endl;
    
    run(&p);        
    run(&c);        

    return 0;
}

输出结果:

void func() 
void func(int i): 1
void func(int i, int j): (1, 2)

void func(int i, int j): 3

void func(int i, int j): (1, 2)
void func(int i, int j): 3

4. 小结

  • 函数重写只可能发生在父类和子类之间
  • 根据实际对象的类型确定调用的具体函数
  • virtual关键字是C++中支持多态的唯一方式
  • 被重写的虚函数可以表现出多态的特性
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 前言 前面我们已经介绍过了C++中的类与函数,不熟悉的,可以去看看NDK开发---C++学习(三):类与函数(上)...
    zhang_pan阅读 557评论 0 3
  • 1.面向对象的程序设计思想是什么? 答:把数据结构和对数据结构进行操作的方法封装形成一个个的对象。 2.什么是类?...
    少帅yangjie阅读 5,145评论 0 14
  • 多态(1)静态多态与动态多态 什么是多态 从字面上理解就是多种形态的意思。而多态一词最初源自希腊语,其含义便是“多...
    kingZXY2009阅读 2,483评论 0 2
  • 收集非原创文章,如遇原作者,请私聊我,我会表明出处! 1--10 1. C++中什么数据分配在栈或堆,静态存储区以...
    Juinjonn阅读 5,055评论 0 30
  • 父子间的同名冲突 首先来看一段代码: 编译通过,说明子类可以定义和父类相同的同名成员。 子类可以定义父类中的同名成...
    nethanhan阅读 296评论 0 0

友情链接更多精彩内容