51 C++ - 抽象基类和纯虚函数(pure virtual function)

简介: 51 C++ - 抽象基类和纯虚函数(pure virtual function)

在设计时,常常希望基类仅仅作为其派生类的一个接口。这就是说,仅想对基类进行向上类型转换,使用它的接口,而不希望用户实际的创建一个基类的对象。同时创建一个纯虚函数允许接口中放置成员原函数,而不一定要提供一段可能对这个函数毫无意义的代码。

做到这点,可以在基类中加入至少一个纯虚函数(pure virtual function),使得基类称为抽象类(abstract class).

  • 纯虚函数使用关键字virtual,并在其后面加上=0。如果试图去实例化一个抽象类,编译器则会阻止这种操作。
  • 当继承一个抽象类的时候,必须实现所有的纯虚函数,否则由抽象类派生的类也是一个抽象类。
  • Virtual void fun() = 0;告诉编译器在vtable中为函数保留一个位置,但在这个特定位置不放地址。

建立公共接口目的是为了将子类公共的操作抽象出来,可以通过一个公共接口来操纵一组类,且这个公共接口不需要事先(或者不需要完全实现)。可以创建一个公共类.

案例: 模板方法模式

//抽象制作饮品
class AbstractDrinking{
public:
  //烧水
  virtual void Boil() = 0;
  //冲泡
  virtual void Brew() = 0;
  //倒入杯中
  virtual void PourInCup() = 0;
  //加入辅料
  virtual void PutSomething() = 0;
  //规定流程
  void MakeDrink(){
    Boil();
    Brew();
    PourInCup();
    PutSomething();
  }
};
//制作咖啡
class Coffee : public AbstractDrinking{
public:
  //烧水
  virtual void Boil(){
    cout << "煮农夫山泉!" << endl;
  }
  //冲泡
  virtual void Brew(){
    cout << "冲泡咖啡!" << endl;
  }
  //倒入杯中
  virtual void PourInCup(){
    cout << "将咖啡倒入杯中!" << endl;
  }
  //加入辅料
  virtual void PutSomething(){
    cout << "加入牛奶!" << endl;
  }
};
//制作茶水
class Tea : public AbstractDrinking{
public:
  //烧水
  virtual void Boil(){
    cout << "煮自来水!" << endl;
  }
  //冲泡
  virtual void Brew(){
    cout << "冲泡茶叶!" << endl;
  }
  //倒入杯中
  virtual void PourInCup(){
    cout << "将茶水倒入杯中!" << endl;
  }
  //加入辅料
  virtual void PutSomething(){
    cout << "加入食盐!" << endl;
  }
};
//业务函数
void DoBussiness(AbstractDrinking* drink){
  drink->MakeDrink();
  delete drink;
}
void test(){
  DoBussiness(new Coffee);
  cout << "--------------" << endl;
  DoBussiness(new Tea);
}


目录
相关文章
|
2月前
|
设计模式 存储 uml
C++ 设计模式实战:外观模式和访问者模式的结合使用,派生类访问基类的私有子系统
C++ 设计模式实战:外观模式和访问者模式的结合使用,派生类访问基类的私有子系统
29 1
|
4月前
|
C++
C++析构函数定义为virtual虚函数,有什么作用?
C++析构函数定义为virtual虚函数,有什么作用?
29 0
|
2月前
|
算法 Java 编译器
【C++ 关键字 virtual 】C++ virtual 关键字(将成员函数声明为虚函数实现多态
【C++ 关键字 virtual 】C++ virtual 关键字(将成员函数声明为虚函数实现多态
25 0
|
8天前
|
Java 编译器 Linux
【C++11(二)】lambda表达式以及function包装器
【C++11(二)】lambda表达式以及function包装器
|
21天前
|
C++
C++面向对象编程中的 纯虚函数 与 抽象类
C++面向对象编程中的 纯虚函数 与 抽象类
|
2月前
|
设计模式 缓存 编译器
【C/C++ 设计模式应用】精细化职责与灵活性:C++中的发送接口和数据转换基类设计
【C/C++ 设计模式应用】精细化职责与灵活性:C++中的发送接口和数据转换基类设计
66 0
|
2月前
|
算法 编译器 程序员
【C++入门到精通】C++入门 —— 继承(基类、派生类和多态性)
继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设计层次的复用。
81 0
|
2月前
|
存储 安全 编译器
【C++ 包装器类 std::function 和 函数适配器 std::bind】 C++11 全面的std::function和std::bind的入门使用教程
【C++ 包装器类 std::function 和 函数适配器 std::bind】 C++11 全面的std::function和std::bind的入门使用教程
33 0
|
4月前
|
存储 编译器 C++
C++ 包装器—function
C++ 包装器—function
|
4月前
C++11实用技术(二)std::function和bind绑定器
C++11实用技术(二)std::function和bind绑定器
26 0