C++ 抽象基类
一、简介
抽象基类: abstract base class,简称ABC,只定义接口,而不涉及实现,主要用于定义派生类的通用接口。抽象基类必须包含至少一个纯虚方法。且包含纯虚函数的抽象基类,不能用来创建对象,只能用作基类。
纯虚方法: 在函数声明的结尾处添加 =0,以表示此函数为纯虚函数。在当前类可不用给出实现。举例声明方式如下:
// 纯虚函数
virtual void functionname() = 0;
二、举例说明
比方说有A、B两个类,最初的设计思想是B类继承A类,但是实际使用过程中发现,A类的许多特性对B类是没有实际意义的,但是A类与B类确实有一定的共同特性。这种情况下我们可以采用抽象基类的方式进行设计。
即从A类与B类抽象出这两个类具有的共同特性,并将这些特性放到一个**ABC(抽象基类)**中,然后再从这个ABC派生出A类与B类。这样就可以使用抽象基类指针同时管理A类与B类对象,可以使用多态方法。
三、实际应用说明
在函数原型中使用=0指出类是一个抽象基类,但在类中可以不定义该函数。但C++可以允许纯虚函数有定义实现。下面以Brass与BrassPlus类使用进行说明,Brass与BrassPlus类是从抽象基类派生出的派生类,向Circle与Ellipse类有时被称具体类,表示可以创建Brass与BrassPlus类对象。
总之,ABC(抽象基类)描述的是至少使用一个纯虚函数的接口,从ABC(抽象基类)派生出的类将根据派生类的具体特征,使用常规虚函数来实现这种接口。
(1)下面示例是ABC(抽象基类)、Brass派生类、BrassPlus派生类具体声明:
// AcctABC抽象基类
class AcctABC
{
private:
std::string fullname;
long acctnum;
double balance;
protected:
struct Formatting
{
std::ios_base::fmtflags flag;
std::streamsize pr;
};
const std::string &FullName() const;
long AcctNum() const;
Formatting SetFormat() const;
void Restore(Formatting &f) const;
public:
AcctABC(const std::string& s = "Nullbody", long an = -1, double bal = 0.0);
virtual ~AcctABC();
void Deposit(double amt);
double Balance() const ;
// Withdraw 纯虚函数
virtual void Withdraw(double amt) = 0;
// ViewAcct 纯虚函数
virtual void ViewAcct() const = 0;
};
Brass派生类