# C++ 中的接口：抽象类

> 原文： [https://beginnersbook.com/2017/09/cpp-abstract-class/](https://beginnersbook.com/2017/09/cpp-abstract-class/)

在 [C++](https://beginnersbook.com/2017/08/c-plus-plus-tutorial-for-beginners/) 中，我们互换使用术语抽象类和接口。具有**纯虚函数**的类称为抽象类。例如，以下函数是纯虚函数：

```cpp
virtual void fun() = 0;
```

纯虚函数用虚拟关键字标记，签名后有`= 0`。您可以将此函数称为抽象函数，因为它没有正文。派生类必须为父类的所有纯虚函数提供实现，否则默认情况下它将成为抽象类。

## 为什么我们需要一个抽象类？

让我们借助现实生活中的例子来理解这一点。让我们说我们有一个类`Animal`，它会睡眠，发出声音等等。现在我只考虑这两个行为并创建一个具有两个函数`sound()`和`sleeping()`的类`Animal`。

现在，我们知道动物的声音是不同的，猫说“喵”，狗说“汪”。那么我在`Animal`类中为函数`sound()`提供了什么实现？这样做的唯一和正确的方法是使这个函数纯粹抽象，这样我就不需要在`Animal`类中给出实现但是所有继承`Animal`的类必须为此函数提供实现。这样我确保所有动物都有声音，但它们有独特的声音。

可以在 C++ 程序中编写相同的示例，如下所示：

## 抽象类示例

```cpp
#include<iostream>
using namespace std;
class Animal{
public:
   //Pure Virtual Function
   virtual void sound() = 0;

   //Normal member Function
   void sleeping() {
      cout<<"Sleeping";
   }
};
class Dog: public Animal{
public:
   void sound() {
      cout<<"Woof"<<endl;
   }
};
int main(){
   Dog obj;
   obj.sound();
   obj.sleeping();
   return 0;
}
```

## 抽象类规则

1）我们已经看到任何具有**纯虚函数**的类都是抽象类。

2）我们无法创建抽象类的实例。例如：如果我在上面的程序中写了这行`Animal obj;`，就会导致编译错误。

3）我们可以创建指向子类的实例的抽象基类的指针和引用。例如，这是有效的：

```cpp
Animal *obj = new Dog();
obj->sound();
```

4）抽象类可以有[构造函数](https://beginnersbook.com/2017/08/cpp-constructors/)。

5）如果派生类没有实现父类的纯虚函数，则派生类变为抽象类。