C++中多态的概念和意义

C++多态性:

1. 定义

“一个接口,多种方法”,程序在运行时才决定调用的函数。

2. 实现:

C++多态性主要是通过虚函数实现的,虚函数允许子类重写override(注意和overload的区别,overload是重载,是允许同名函数的表现,这些函数参数列表/类型不同)。

*多态与非多态的实质区别就是函数地址是早绑定还是晚绑定。

*如果函数的调用,在编译器编译期间就可以确定函数的调用地址,并生产代码,是静态的,就是说地址是早绑定的。

*而如果函数调用的地址不能在编译器期间确定,需要在运行时才确定,这就属于晚绑定。 

3.目的:

接口重用。封装可以使得代码模块化,继承可以扩展已存在的代码,他们的目的都是为了代码重用。而多态的目的则是为了接口重用。
4.用法:

声明基类的指针,利用该指针指向任意一个子类对象,调用相应的虚函数,可以根据指向的子类的不同而实现不同的方法。

 

 

#include <iostream>
#include <string>

using namespace std;

class Parent
{
public:
    virtual void print()  // 这个函数可能被继承的子类重写,所以加上virtual 关键字来修饰它,称为虚函数,实现多态;
    {
        cout << "I'm Parent." << endl;
    }
};

class Child : public Parent
{
public:
    void print()  // 虽然没有写 virtual 关键字,但是由于继承的关系,它就是虚函数;一般工程中没必要在子类中写 virtual;
    {
        cout << "I'm Child." << endl;
    }
};

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

int main()
{
    Parent p;
    Child c;

    how_to_print(&p);    // 期望打印: I'm Parent.  实际打印:I'm Parent.
    how_to_print(&c);    // 期望打印: I'm Child.  实际打印:I'm Child.

    return 0;
}

 

多态意义:

1,在程序运行过程中展现出动态的特性;

1,编译时无法决定究竟调用哪一个版本的实现;

2,函数重写必须多态实现,否则没有意义;

1, C++ 后续语言(Java、C#)中,只要是重写,一定是虚函数,不需要显示声明 virtual 关键字;

3,多态是面向对象组件化程序设计的基础特性;

1,后续学习中多态特性会被变着花样玩儿,特别是设计模式中绝大多数模式都和多态相关;

posted @ 2021-04-22 09:16  恋恋西风  阅读(979)  评论(0编辑  收藏  举报