C++ 运行时多态
Posted Python可视化编程机器学习OpenCV
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++ 运行时多态相关的知识,希望对你有一定的参考价值。
本篇知识点:
继承
抽象类
多态
虚函数与虚析构
纯虚函数与纯虚析构
练习代码如下:
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++ 运行时多态的主要内容,如果未能解决你的问题,请参考以下文章