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;
}
本文分享自 Python可视化编程机器学习OpenCV 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!