例如我们在计算个人资产净值时,汽车,珠宝,不动产,股票,银行存款都是个人资产的不同类型。

所谓净值是资产的当前现金价值。汽车的净值根据它的保养情况,行驶里程,使用年限有关。

而珠宝的净值会随年限增长,也就是说不能用一个函数来实现计算净值

 1 class TPersonalAsset
 2 {
 3 public:
 4     TPersonalAsset(const char purchaseDate[]);
 5     //虽然未显示拷贝构造函数,赋值操作符等,但必须实现它们
 6     virtual ~TPersonalAsset();
 7     
 8     //该资产当前的价值
 9     virtual float ComputeNetWorth() const;
10 
11     //该资产是否投保?
12     virtual bool IsInsurable() const;
13 
14     void SetPurchaseDate(const char date[]);
15     //更多细节已省略
16 
17 private:
18     TDate _purchaseDate;
19 };

实现ComputeNetWorth()是很难的

 

我们希望保证TPersonAsset的所以派生类都可以使用ComputerNetWorth方法,而且确保任何人都无法创建(实例化)

TPersonalAsset类的对象(因为ComputerNetWorth方法并未实现)。

这是抽象类(也就是延期类)就拍上用处了。

 

defines:

1.抽象类:包含(甚至通过继承)至少一个纯虚函数的类。

2.纯虚函数:在类声明中等于0的虚函数。

 

 1 class TPersonalAsset
 2 {
 3 public:
 4     TPersonalAsset(const char purchaseDate[]);
 5     //虽然未显示拷贝构造函数,赋值操作符等,但必须实现它们
 6     virtual ~TPersonalAsset();
 7     
 8     //该资产当前的价值
 9     virtual float ComputeNetWorth() const = 0;
10 
11     //该资产是否投保?
12     virtual bool IsInsurable() const;
13 
14     void SetPurchaseDate(const char date[]);
15     //更多细节已省略
16 
17 private:
18     TDate _purchaseDate;
19 };

 

抽象类的独特性质:

1.不能创建抽象类的对象,但是,指向抽象类的指针和对抽象类的引用仍然合法。

2.抽象类只能用于基类。换言之,派生类是抽象类的唯一客户。

3.如果通过抽象类创建派生类的对象,那么抽象类的每个派生类都必须实现所继承的纯虚函数(否则派生类也将成为一个抽象类)

 

note:

为什么IsInsurable成员函数是虚函数,因为该例认为资产随着时间的推移,可能变得不可投保(太陈旧,没有市场价值)。为了

说明这种行为的变化,每种资产都可以覆盖IsInsurable成员函数,并单独动态地确定它们是否可投保。

posted on 2017-03-23 10:28  郑哲  阅读(154)  评论(0编辑  收藏  举报