c++ 多态学习

Posted 钟钟终

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c++ 多态学习相关的知识,希望对你有一定的参考价值。

单纯的学习记录 QAQ

虚析构和纯虚析构
1.解决父类指针释放(开辟到堆区的)子类对象
2.需要具体的函数实现、

虚析构:
virtual ~类名()
{
   (可为空)
}
--------------------------------------------------------
纯虚析构
virtu ~类名()=0;
(类外)
类名::~ 类名() 
{
   (可为空)
}

1.简易计算器

#include <iostream>

using namespace std;
class calculate
{
public:
    virtual int result()=0;      //纯虚函数语法:virtual 返回值类型 函数名 (参数列表)= 0 ;
    int num1;
    int num2;
};
class add:public calculate       // “+” 功能
{
public:
    int result()               //子类必须重写父类虚函数
    {
        return num1+num2;
    }
};
class mins:public calculate   //“-” 功能
{
public:
    int result()
    {
        return num1-num2;
    }
};
void yinyong(calculate &calculate)
{
    cout<<calculate.result()<<endl;
}
int main()
{
    calculate *p=new add;       //父类指针或引用指向子类对象
    p->num1=10;
    p->num2=20;
    cout<<p->result()<<endl;
    delete p;                 //堆区需要手动释放

    mins m;
    m.num1=100;
    m.num2=200;
    yinyong(m);              //父类引用指向子类对象

    return 0;
}

2.制作饮品

#include <iostream>

using namespace std;
class drinks
{
public:
    virtual void boilwater()=0;  //纯虚函数
    virtual void brew()=0;       //抽象类无法实例化对象
    virtual void pour()=0;       //类中只要有一个抽象函数就成为抽象类
    virtual void relish()=0;
    void show()
    {
        boilwater();
        brew();
        pour();
        relish();
    }
};
class coffee:public drinks
{
public:
    void boilwater()
    {
        cout<<"煮水"<<endl;          //重写父类纯虚函数
    }
    void brew()
    {
        cout<<"冲泡咖啡"<<endl;
    }
    void pour()
    {
        cout<<"倒入杯中"<<endl;
    }
    void relish()
    {
        cout<<"加入糖和牛奶"<<endl;
    }
};
class tea:public drinks
{
public:
    void boilwater()
    {
        cout<<"煮水煎茶"<<endl;
    }
    void brew()
    {
        cout<<"冲泡茶叶"<<endl;
    }
    void pour()
    {
        cout<<"倒入茶壶"<<endl;
    }
    void relish()
    {
        cout<<"加入柠檬"<<endl;
    }
};
void dowork(drinks *p) //虚基类的指针,指向子类对象
{
    p->show();
    delete p;
}
int main()
{
    coffee c;
    c.show();
    cout<<"----------------------------------------------"<<endl;
    dowork(new tea);
    delete new tea;    //创建到堆区的tea 手动释放
    return 0;
}

3.组装电脑
1.设置父类纯虚函数。(CPU,显卡,内存条)
2.不同公司要继承零件,
3.组装电脑。由于零件可能来自不同的公司,需要用指针进行控制,也就是用三个。
(用new开辟小堆区,类也能作为参数。指针可以指向用new开辟的类)

#include <iostream>

using namespace std;
class CPU
{
public:
    virtual void calculate()=0;
};
class videocard
{
public:
    virtual void display()=0;
};
class memory
{
public:
    virtual void storage()=0;
};

//*****************************************************************************
class Intel_CPU:public CPU
{
public:
     void calculate()
    {
        cout<<"Intel的CPU开始工作了"<<endl;
    }
};
class Intel_videocard:public videocard
{
public:
     void display()
    {
        cout<<"Intel的显卡开始工作了"<<endl;
    }
};
class Intel_memory:public memory
{
public:
     void storage()
    {
        cout<<"Intel的内存条开始工作了"<<endl;
    }
};
//**********************************************************************
class Lenovo_CPU:public CPU
{
public:
     void calculate()
    {
        cout<<"Lenovo的CPU开始工作了"<<endl;
    }
};
class Lenovo_vidercard:public videocard
{
public:
     void display()
    {
        cout<<"Lenovo的显卡开始工作了"<<endl;
    }
};
class Lenovo_memory:public memory
{
public:
     void storage()
    {
        cout<<"Lenovo的内存条开始工作了"<<endl;
    }
};
//***********************************************************************
class computer
{
    CPU *m1;
    videocard *m2;
    memory *m3;
public:
    computer(CPU *m4,videocard *m5,memory *m6)
    {
        m1=m4;m2=m5;m3=m6;
    }
    void work()
    {
        m1->calculate();
        m2->display();
        m3->storage();
    }
    ~computer()
    {
        if(m1!=NULL)
        {
            delete m1;
        }
        if(m2!=NULL)
        {
            delete m2;
        }
        if(m3!=NULL)
        {
            delete m3;
        }
    }
};

int main()
{
//第一台电脑零件
    CPU *m1=new Intel_CPU;
    videocard *m2=new Intel_videocard;
    memory *m3=new Intel_memory;
    cout<<"第一台电脑开始工作: "<<endl;
    computer *c1=new computer(m1,m2,m3);
    c1->work();
    delete c1;
    cout<<endl<<"----------------------------------------"<<endl;
    cout<<"第二台电脑开始工作:"<<endl;
    computer *c2=new computer(new Lenovo_CPU,new Lenovo_vidercard,new Lenovo_memory);
    c2->work();
    delete c2;
    cout<<endl<<"----------------------------------------"<<endl;
    cout<<"第三台电脑开始工作:"<<endl;
    computer *c3=new computer(new Intel_CPU,new Lenovo_vidercard,new Intel_memory);
    c3->work();
    delete c3;
}

输出:

第一台电脑开始工作:
Intel的CPU开始工作了
Intel的显卡开始工作了
Intel的内存条开始工作了

----------------------------------------
第二台电脑开始工作:
Lenovo的CPU开始工作了
Lenovo的显卡开始工作了
Lenovo的内存条开始工作了

----------------------------------------
第三台电脑开始工作:
Intel的CPU开始工作了
Lenovo的显卡开始工作了
Intel的内存条开始工作了

Process returned 0 (0x0)   execution time : 0.047 s
Press any key to continue.

以上是关于c++ 多态学习的主要内容,如果未能解决你的问题,请参考以下文章

java中封装,继承,多态,接口学习总结

c++学习笔记:多态

学习 C++:多态性和切片

c++ 多态学习

学习:类和对象——多态

C++学习:3多态