前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C++ 运行时多态

C++ 运行时多态

作者头像
用户6021899
发布2021-05-20 10:34:59
1.2K0
发布2021-05-20 10:34:59
举报

C++运行时多态性是通过类的继承来实现的,通过重载父类虚函数,当父类指针指向子类对象时,父类和各个子类以同一个接口实现不同的行为。函数调用的地址不能在编译器期间确定,需要在运行时才确定,也叫动态多态。

本篇知识点:

  • 继承
  • 抽象类
  • 多态
  • 虚函数与虚析构
  • 纯虚函数与纯虚析构

练习代码如下:

代码语言:javascript
复制
#include<iostream>
using namespace std;


class AbstractDrinking
{
//存在纯虚函数,则类是抽象类(即无法实例化对象)
public:
    //纯虚函数,可以仅有声明
    virtual void boil() =0;//煮水
    
    virtual void brew() =0;//冲泡
    
    virtual void putSomethingElse()=0;//加入辅料
    
    void makeDrink()
{
        boil();
        brew();
        putSomethingElse();
    }
    
    AbstractDrinking()
    {
        cout<<"AbstractDrinking类 构造函数调用"<<endl;
    }
    //虚析构的写法
//    virtual ~AbstractDrinking()
//    {
//        cout<<"AbstractDrinking类 虚析构函数调用"<<endl;
//    }

    //纯虚析构,不能仅有声明
    virtual ~AbstractDrinking() = 0;
};

  //纯虚析构的定义,不能仅有声明
AbstractDrinking::~AbstractDrinking()
{
    cout<<"AbstractDrinking类 纯虚析构函数调用"<<endl;
}



class Coffee: public AbstractDrinking
{
public:
    Coffee()
    {
        cout<<"Coffee类 构造函数调用"<<endl;
    }

    virtual void boil()//重写抽象基类虚函数
{
        cout<<"煮开水";
        cout<<"(水温"<<* temperature<<"摄氏度)"<<endl;
    }

    virtual void brew()//重写抽象基类虚函数
{
        cout<<"倒入咖啡"<<endl;
    }

    virtual void putSomethingElse()//重写抽象基类虚函数
{
        cout<<"放入咖啡伴侣"<<endl;
    }

    void makeDrink()
{
        boil();
        brew();
        putSomethingElse();
    }
    
    virtual ~Coffee()
    {
        cout<<"Coffee类 析构函数调用"<<endl;
        //写析构函数的作用是用来释放堆区数据
        //若类内没有创建堆区数据,可不用写析构函数
        if(temperature != NULL)
        {
            delete temperature;
            temperature = NULL;
        }
    }
private:
    float * temperature = new float(100);//堆区数据
    
};


class Tea: public AbstractDrinking
{
public:
    Tea()
    {
        cout<<"Tea类 构造函数调用"<<endl;
    }
    virtual void boil()
{
        cout<<"煮热水";
        cout<<"(水温"<<* temperature<<"摄氏度)"<<endl;
    }

    virtual void brew()
{
        cout<<"倒入茶叶"<<endl;
    }

    virtual void putSomethingElse()
{
        cout<<"放入枸杞"<<endl;
    }

    void makeDrink()
{
        boil();
        brew();
        putSomethingElse();
    }


    virtual ~Tea()
    {
        cout<<"Tea类 析构函数调用"<<endl;
        if(temperature != NULL)
        {
            delete temperature;
            temperature = NULL;
        }
    }
private:
    float * temperature = new float(90);//堆区数据
    
};



void makeDrink(AbstractDrinking* abs)
{
    abs->makeDrink();
    delete abs;//使用完成后须释放堆区数据
    cout<<"----------------------------\n"<<endl;
}


int main()
{
    //AbstractDrinking* abs = new Coffee;
    //makeDrink(abs);
    //delete abs;


    //abs = new Tea;
    //makeDrink(abs);
    //delete abs;


    //AbstractDrinking absd;//error: cannot declare variable 'absd' to be of abstract type 'AbstractDrinking'|

    //子类指针传给抽象基类指针形参
    makeDrink(new Coffee);
    makeDrink(new Tea);

    return 0;
}
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-05-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python可视化编程机器学习OpenCV 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档