admin 管理员组

文章数量: 1184232

C++(十二):多态

多态

动态多态

动态多态的满足条件:

  1. 存在继承关系;
  2. 子类需要重写父类的虚函数。

虚函数:父类的函数在定义的时候在返回类型前面添加 virtual 关键字。
重写:指的是在子类编写新的函数,但是返回类型、函数名、形参列表完全相同,函数体可以不同。

动态多态的使用:
利用父类的指针或者引用来执行子类的对象。

动态多态的底层

纯虚函数与抽象类

virtual void func() = 0;

形如上面的函数称为 纯虚函数 ,拥有纯虚函数的类称为 抽象类 。抽象类是天然的父类,因为它不能实例化对象。在抽象类中的纯虚函数事实上提供了一个接口,子类分别通过这个接口实现各自的功能。

而继承了抽象类的子类必须在类中重写纯虚函数,否则这个子类也被认为是抽象类而不能实例化对象。

因此,当我们有一个类不实现任何功能而希望所有继承它的子类各自实现功能的时候,我们可以写成抽象类。

class AbstractDrinking
{
public:virtual void zhushui() = 0;virtual void chongpao() = 0;virtual void daoru() = 0;virtual void fuliao() = 0;
};class Tea : public AbstractDrinking
{
public:virtual void zhushui(){cout << "煮山泉水" << endl;}virtual void chongpao(){cout << "冲泡茶叶" << endl;}virtual void daoru(){cout << "倒入茶壶" << endl;}virtual void fuliao(){cout << "加入枸杞" << endl;}
};void duotai(AbstractDrinking &abstractdrinking)
{abstractdrinking.zhushui();abstractdrinking.chongpao();abstractdrinking.daoru();abstractdrinking.fuliao();
}int main()
{Tea tea;duotai(tea);
}

虚析构和纯虚析构

两者的共性:

  1. 可以解决父类指针释放问题;
  2. 需要有具体的函数实现。

区别:

  1. 含有纯虚析构的类也属于抽象类。

子类中有一些成员开辟在堆区的话,普通的函数构造没法走到子类的析构上去,由此产生内存泄漏。

在设计这样的类的时候,最好实际测试一下是否会走析构函数。

本文标签: C(十二)多态