前言
本篇继续类继承,抽象类
如果两个类之间的关系是A is like B,则最好的类设计方法是,将AB共同的部分提取出来作为一个抽象基类。
纯虚函数与抽象类
C++的类能够提供没有定义的函数,被称为纯虚函数(pure virtual function),声明如下:
virtual 返回类型 函数名(参数列表) = 0;
纯虚函数表示一个未实现的接口,需要在派生类中重新实现。
包含纯虚函数的类自动成为抽象类,抽象类不能创建具体的对象;实现了纯虚函数的派生类称为具体类。
抽象类示例如下:
#include <cstdio>
#include <iostream>
#include <cstring>
using std::ostream;
class Base{
private:
int a_;
public:
Base(int);
virtual void print() = 0;
};
Base::Base(int a){
a_ = a;
}
void Base::print(){
std::cout << a_ << '\n';
}
class Derived : public Base{
private:
double b_;
public:
Derived(int, double);
virtual void print();
};
Derived::Derived(int a, double b): Base(a), b_(b) {}
void Derived::print(){
Base::print();
std::cout << b_ << '\n';
}
int main(){
Base* pobj;
Derived obj(1, 2.2);
pobj = &obj;
pobj->print();
return 1;
}
抽象基类Base
不能创建对象,否则报error: cannot declare variable 'pobj' to be of abstract type 'Base'
注意:可以创建抽象基类的指针,指向派生类对象。
抽象基类派生的具体类,必须重写纯虚函数,否则报error: cannot declare variable 'obj' to be of abstract type 'Derived' because the following virtual functions are pure within 'Derived'
,不在派生类中重写纯虚函数,意味着派生类继承了基类的纯虚函数,仍是未实现的(纯虚)。
纯虚函数可以在基类中定义,不会报错,但具体类仍然必须重写纯虚函数的实现。
声明纯虚函数意味着,所有派生类都必须遵从该函数接口形式,而实现方法则根据派生类的具体特征来设计。
注意:尽量不在抽象类中定义纯虚函数。