💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
# 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)如果派生类没有实现父类的纯虚函数,则派生类变为抽象类。