抽象基类(Abstruct base class)
包含纯虚函数的类只用作基类, 要成为抽象基类, 必须至少包含一个纯虚函数.
纯虚函数: 函数原型中的=0使虚函数称为纯虚函数. 例如下面例子中的Area()方法
class BaseEllipse
{
private:
double x;
double y;
public:
BaseEllipse(double x0 = 0, double y0 = 0) : x(x0), y(y0) {}
virtual ~BaseEllipse() {}
void Move(int nx, int ny)
{
x = nx;
y = ny;
}
// 纯虚函数
virtual double Area() const = 0;
}
这里的方法Area()没有定义, 但C++甚至允许纯虚函数有定义. 例如: 也许所有的基类方法都与Move()一样, 可以在基类中进行定义, 但仍需将这个类声明为抽象的. 在这种情况下, 可以将原型声明为虚的:
void Move(int nx, ny) = 0;
这将使基类成为抽象的, 但仍可以在实现文件中提供方法的定义:
void BaseEllipse::Move(int nx, ny)
{
x = nx;
y = ny;
}
总之, 在原型中使用=0指出类是一个抽象基类, 在类中可以不定义该函数.
抽象类不能用来创建对象
抽象类的示例:
第一个文件
// acctabc.h
#ifndef ACCTABC_H_
#define ACCTABC_H_
#include <iostream>
#include <string>
// 抽象基类
class AcctABC
{
private:
std::string fullName;
long acctNum;
double balance;
// protected修饰的子类可见, 外部不可见
protected:
struct Formatting
{
std::ios_base::fmtflags flag;
std::streamsize pr;
};
const std::string & FullName() const
{
return fullName;
}