// pure virtual function

// pure virtual function

总之,在原型中使用=0指出类是一个抽象基类,在类中可以不定义该函数。
现在,可以从BaseEllipse 类派生出Ellips类和Circle类,添加所需的成员来完成每个类。需要注意的
点是,Circle类总是表示圆,而Ellipse类总是表示椭圆 -- 也可以是圆。不过,Ellipse类圆可被重新缩
放为非圆,而Ciecle类圆必须始终为圆。
使用这些类的程序将能够创建Ellipse对象和Circle对象,但是不能创建BaseEllipse对象。由于Circle
和Ellipse对象的基类相同,因此可以用BaseEllipse 指针数组同时管理这两种对象。像Circle和Ellipse这
样的类有时被称为具体(concrete)类,这表示可以创建这些类型的对象。
简而言之,ABC描述的是至少使用一个纯虚函数的接口,从ABC派生出的类将根据派生类的具体特
征,使用常规虚函数来实现这种接口。

13.6.1 应用ABC概念

您可能希望看到·个完整的ABC范例,因此这里将这一概念用于Brass和BrassPlus账户,首先定义
个名为 AcctABC的ABC。这个类包含 Brass 和 BrassPlus 类共有的所有方法和数据成员,而那些在
BrassPlus 类和Brass类中的行为不同的方法应被声明为虚函数。至少应有一个虚函数是纯虚函数,这样才
能使AcctABC成为抽象类。
程序清单13.11的头文件声明了AcctABC类(ABC)、Brass类和BrassPlus类(两者都是具体类)。为
帮助派生类访问基类数据,AcctABC提供了一些保护方法;派生类方法可以调用这些方法,但它们并不是
派生类对象的公有接口的组成部分。AcctABC还提供一个保护成员函数,用于处理前面几种方法中执行的
格式化。另外,AcctABC类还有两个纯虚函数,所以它确实是抽象类。

程序清单13.11 acctabc.h
// acctabc.h -- bank account classes
difndef ACCTABC_H
#define ACCTABC_H

// Abstract Base Class
class AcctABC

private:
enum {MAX = 35):
char fullName [MAX]:
long acctNum;
double balance:
protected:
const char * FullName()const (return fullName: )
long AcctNum()const (return acctNum; }
std :: ios_base: : fmtflags SetFormat() const:
public:
AcctABC (const char *s - "Nullbody", long an - -1,
double bal = 0.0);
void Deposit (double amt):
virtual void Withdraw (double amt) = 0: // pure virtual function
double Balance()const ireturn balance: }:
virtual void ViewAcct() const = D;
virtual -AcctABC((}

// Brass Account Class
class Brass: public AcctABC

public:
Brass (const char *s - "Nullbody", long an - -1,
double bal = 0.0): AcctABC (s, an. bal) { }
virtual void Withdraw (double amt):