C++ 运行时多态

Posted Python可视化编程机器学习OpenCV

tags:

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


本篇知识点:

  • 继承

  • 抽象类

  • 虚函数与虚析构

  • 纯虚函数与纯虚析

练习代码如下:

#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;}



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

C++系列总结——多态

C++的动态多态与静态多态

[c++]第六章概念题 | 多态

编译期多态和运行时多态

C++ 多态相关

C++多态底层剖析