目录 Table of Contents
13 纯虚函数
在我们讲虚函数的时候我们简单提了一下纯虚函数, 这个东西语法简单, 但是使用起来难理解
什么是纯虚函数 ?_
-
将该成员函数声明为
virtual
-
该函数没有函数体 (后面跟上
=0;
)
比如 :
class CBank
{
public:
virtual double GetAnnualRate() = 0; // 纯虚函数
};
抽象类
-
含有纯虚函数的类, 称为抽象类 (abstract class)
-
抽象类也可以包含普通的函数
-
抽象类不能实例化
如 :
CBank bank; // 在栈或者全局区域创建对象; 你把这行代码写在全局区域就是在全局区域创建对象, 写在函数里面就是在栈里创建对象
CBank* pBank = new CBank(); // 无论在哪里写, 都是在堆里面创建对象
编译器会报错 :
cannot instantiate abstract class due to following members
抽象类可以把它看作是对子类的一种约束, 也可以把它看作是定义的一种标准
就好比淘宝, 我们在淘宝开了一个店. 那么这个淘宝, 卖什么的都有, 你去每家淘宝店, 发现它们都是不一样的, 但是它们都有一些相同的东西. 比如都有商品展示区, 都有购物车, 都有评论区. 那么你想过没有, 就是内容虽然不一样, 但是它们遵守的规则是一样的.
你就可以这么理解了, 淘宝就是先创建出了一个抽象类. 这个抽象类里面有商品展示, 有下订单, 有查看购物车, 有用户评价等等这些功能, 但是这些功能它都没有去实现, 它只把标准定义好了, 真正实现的是它的子类.
当你开一个淘宝店的时候, 你就是一个子类, 你就要按它的规范去把它的功能实现了.
#include <stdio.h>
#include <windows.h>
// 抽象类 : 看作是一个标准, 任何该类的子类都必须遵守的标准
class CBank
{
public:
virtual double GetAnnualRate() = 0; // 纯虚函数
};
// 中国工商银行
class CICBCBank:public CBank
{
private:
double m_dPrincipal; // 本金
public:
CICBCBank(double dPrincipal)
{
m_dPrincipal = dPrincipal;
}
double GetAnnualRate() // 实现了父类的规范
{
return 0.1;
}
double GetTotalMoney()
{
return m_dPrincipal + m_dPrincipal * GetAnnualRate();
}
};
// 中国建设银行
class CCCBank:public CBank
{
private:
double m_dPrincipal;
public:
CCCBank(double dPrincipal)
{
m_dPrincipal = dPrincipal;
}
double GetAnnualRate()
{
return 0.2;
}
double GetTotalMoney()
{
return m_dPrincipal + m_dPrincipal * GetAnnualRate();
}
};
// 统计每一家银行年利率是多少, 大家必须遵守相同的标准, 这个函数才可以去统计
void ShowAnnualRate(CBank* pBank[], DWORD nLength)
{
for(int i = 0; i < nLength; i++)
{
printf("%.2lf \n", pBank[i]->GetAnnualRate()); // 通过指针调用当前对象获取年利率的函数
}
}
int main(int argc, char* argv[])
{
CICBCBank icbc(1000.0);
double dMoney1 = icbc.GetTotalMoney();
CCCBank ccb(10000);
dMoney2 = ccb.GetTotalMoney();
CBank* pBank[] = {&icbc, &ccb}; // 定义了一个指针数组, CBank 类型数组, 然后把它的两个子类直接传进来
ShowAnnualRate(pBank, 2);
return 0;
}
我们定义了一个类叫作银行 CBank, 任何一家银行都会有年利率这个属性, 但是年利率的值可能会不一样.
既然每一家银行都需要提供这么一个年利率函数, 那么我就可以把它抽象成一个纯虚函数.
然后我们创建了一个子类, 这个子类叫作工商银行, 工商银行首先继承了抽象类 CBank, 然后实现了父类定义的规范
然后我们又创建了一个中国建设银行子类, 套路和上面的一样.
抽象类的价值在于定义了一种标准, 所有的子类必须都遵守这种规范 (必须都重写纯虚函数), 那么我们才可以对它们进行统一的管理, 具体点就是让它们使用共同的函数.