在多态中,通常父类中的虚函数实现是毫无意义的,主要是调用子类重写的内容,因此可以将虚函数改为纯虚函数
- 纯虚函数语法:
virtual 返回值类型 函数名(参数列表)= 0;
- 当类中有了纯虚函数,这个类也成为抽象类
- 抽象类特点
- 无法实例化对象
- 子类必须重写抽象类中的纯虚函数,否则也属于抽象类
#include <iostream>
using namespace std;
//纯虚函数和抽象类
class Base
{
public:
//只要有一个纯虚函数,这个类就是抽象类
//1.无法实例化对象(没办法写对象)
virtual void func() = 0;
};
class Son:public Base
{
public:
virtual void func()
{
cout << "func函数调用" << endl;
};
};
void test01()
{
//Base b; //无法实例化对象,会报错
Son s; //子类必须重写父类中的纯虚函数,否则无法实例化对象
//利用多态的技术调用:指针或引用调用接口
Base *base =new Son;
base -> func();
}
int main()
{
test01();
system("pause");
return 0;
}
- 小案例:制作冷饮
案例描述:煮水、冲泡、倒杯中、加入辅料,利用多态实现
#include <iostream>
using namespace std;
class abstractdrinking
{
public:
//煮水
virtual void Boil () = 0;
//冲泡
virtual void Brew () = 0;
//倒入杯中
virtual void Pour () = 0;
//加入辅料
virtual void putsomething () = 0;
//制作饮品
void makeDrink() //接口
{
Boil();
Brew ();
Pour () ;
putsomething ();
}
};
class Coffee:public abstractdrinking
{
public:
//煮水
virtual void Boil ()
{
cout << "煮农夫山泉" << endl;
}
//冲泡
virtual void Brew ()
{
cout << "冲泡咖啡" << endl;
}
//倒入杯中
virtual void Pour()
{
cout << "倒入杯中" << endl;
}
//加入辅料
virtual void putsomething ()
{
cout << "加入牛奶" << endl;
}
};
class Tea : public abstractdrinking
{
public:
//煮水
virtual void Boil()
{
cout << "煮山泉" << endl;
}
//冲泡
virtual void Brew()
{
cout << "冲泡茶叶" <<endl;
}
//倒入杯中
virtual void Pour()
{
cout << "倒入杯中" << endl;
}
//加入辅料
virtual void putsomething()
{
cout << "加入枸杞" << endl;
}
};
//制作函数,调用父类中的制作接口
void dowork(abstractdrinking *abs)
{
abs->makerDrink(); //一个接口多种形态,实现了多态
delete abs; //堆区开辟记得释放
}
void test01()
{
dowork(new Coffee);
dowork(new Tea);
}
int main()
{
tets01();
system("pause");
return 0;
}
小结:拥有纯虚函数的一定是父类(无法被实例化),且子类必须实现这个函数,否则还是抽象类