cout << "Owed to bank: $" << owesBank << endl:
cout << "Loan Rate: " << 100 * rate << "%
":
cout.setf (initialState);
-
void BrassPlus: :Withdraw (double amt)
ios_base : :fmtflags initialState = SetFormat ():
double bal = Balance ():
if (amt <= bal)
AcctABC :: Withdraw (amt):
else if (amt <= bal + maxLoan - owesBank)
double advance = amt - bal:
owesBank += advance * (1.0 + rate);
cout << "Bank advance: $" << advance << endl;
cout << "Finance charge: $" << advance * rate << endl:
Deposit (advance):
AcctABC :: Withdraw (amt);
else
cout << "Credit limit exceeded. Transaction cancelled.
":
cout.setf (initialState);
保护方法FullName()和AcctNum()提供了对数据成员fullName和acctNum的只读访问,使得可以进
一步定制每个派生类的 ViewAcct()。
对Brass和BrassPlus账户的这种新实现,使用方式与旧实现相同,因为类方法的名称和接口都与以前
样。例如,为使程序清单13.10 能够使用新的实现,需要采取下面的步骤将 usebrass2.cpp 转换为
usebrass3.cpp:
● 使用acctabc.cpp而不是 brass.cpp 来链接 usebrass2.cpp。
● 包含文件 acctabc.h,而不是brass.h。
● 将“Brass*p_clients[CLIENTS]:”替换为“AcctABC*p_clients[CLIENTS]:”
13.6.2 ABC理念
在处理继承的问题上,RatedPlayer范例使用的方法比较随意,而ABC方法比它更具系统性、更规范。
设计 ABC之前,首先应开发一个模型 -- 指出编程问题所需的类以及它们之间相互关系。一种学院派思
想认为,如果要设计类继承层次,则只能将那些不会被用作基类的类设计为具体的类。这种方法的设计更
清晰,复杂程度更低。
实际应用注意事项:使用ABC实施接口规则
可以将ABC看作是一种必须实施的接口。ABC要求具体派生类覆盖其纯虛函数––迫使派生类遵術
ABC所设置的接口规则。这种模型在基于组件的编程模式中很常见,在这种情况下,使用ABC使得组件
设计人员能够制定“接口约定”,这样确保了从ABC派生的所有组件都至少支持ABC指定的功能。
13.7
继承和动态内存分配
继承是怎样与动态内存分配(使用new和delete)进行互动的呢?例如,如果基类使用动态内存分配,
并重新定义赋值和复制构造函数,这将怎样影响派生类的实现呢?这个问题的答案取决于派生类的属性。
如果派生类也使用动态内存分配,那么就需要学习几个新的小技巧。下面来看看这两种情况。