【c++深度解析11】多态的概念和意义

在同名覆盖引发的问题中,父类对象指向子类对象直接将其退化为父类对象,导致没有达到函数重写期望的结果,那么程序怎样根据实际的对象类型判断如何调用重写函数了,c++中的多态就可以解决该问题

c++语言直接 支持多态:

通过virtual关键字来进行支持,被virtual声明的函数叫做虚函数

多态的概念:

静态联编: 在程序的编译期间就能够确定具体的函数调用,如:函数重载

动态联编:在程序的实际运行后才能确定具体的函数调用  如:函数重写 (多态,工程中函数重写必须多态实现,否则没有意义

多态的意义:

1.在程序运行过程中,展现出现在的特性

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

3.多态是面向对象组件化程序设计的基础特性,设计模式中大部分就需用到多态的特性

函数重载,函数重写和函数覆盖的区别:

1.函数重载发生在相同作用域

2.函数重写发生在父类与子类之间存在继承关系(工程中需用多态实现)

3.函数覆盖发生在父类和子类之间,子类的函数名与父类函数名同名则父子函数之间存在函数覆盖;

下面通过一个例子来加深理解:

#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);     // 展现多态的特性
                       // 动态联编
}


int main()
{
    Parent p;
    
    p.func();         // 静态联编
    p.func(1);        // 静态联编
    p.func(1, 2);     // 静态联编
    
    cout << endl;
    
    Child c;
    
    c.func(1, 2);     // 静态联编
    
    cout << endl;
    
    run(&p);
    run(&c);
    
    return 0;
}
 

猜你喜欢

转载自blog.csdn.net/lvmengzou/article/details/86853988
今日推荐