例如我们在计算个人资产净值时,汽车,珠宝,不动产,股票,银行存款都是个人资产的不同类型。
所谓净值是资产的当前现金价值。汽车的净值根据它的保养情况,行驶里程,使用年限有关。
而珠宝的净值会随年限增长,也就是说不能用一个函数来实现计算净值
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成员函数,并单独动态地确定它们是否可投保。