在 C++中,我们互换使用术语抽象类和接口。具有纯虚函数的类称为抽象类。例如,以下函数是纯虚函数:
纯虚函数用虚拟关键字标记,签名后有= 0
。您可以将此函数称为抽象函数,因为它没有正文。派生类必须为父类的所有纯虚函数提供实现,否则默认情况下它将成为抽象类。
为什么我们需要一个抽象类?
让我们借助现实生活中的例子来理解这一点。让我们说我们有一个类Animal
,它会睡眠,发出声音等等。现在我只考虑这两个行为并创建一个具有两个函数sound()
和sleeping()
的类Animal
。
现在,我们知道动物的声音是不同的,猫说“喵”,狗说“汪”。那么我在Animal
类中为函数sound()
提供了什么实现?这样做的唯一和正确的方法是使这个函数纯粹抽象,这样我就不需要在Animal
类中给出实现但是所有继承Animal
的类必须为此函数提供实现。这样我确保所有动物都有声音,但它们有独特的声音。
可以在 C++ 程序中编写相同的示例,如下所示:
抽象类示例
抽象类规则
1)我们已经看到任何具有纯虚函数的类都是抽象类。
2)我们无法创建抽象类的实例。例如:如果我在上面的程序中写了这行Animal obj;
,就会导致编译错误。
3)我们可以创建指向子类的实例的抽象基类的指针和引用。例如,这是有效的:
4)抽象类可以有构造函数。
5)如果派生类没有实现父类的纯虚函数,则派生类变为抽象类。