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