C++ 中的抽象类和纯虚函数
原文:https://www.studytonight.com/cpp/abstract-class-and-pure-virtual.php
抽象类是至少包含一个纯虚函数的类。抽象类用于为其子类提供接口。继承抽象类的类必须为纯虚函数提供定义,否则它们也将成为抽象类。
抽象类的特征
- 抽象类不能被实例化,但是指针和抽象类类型的引用可以被创建。
- 抽象类可以有普通函数和变量以及一个纯虚函数。
- 抽象类主要用于上播,使其派生类可以使用其接口。
- 继承抽象类的类必须实现所有纯虚函数,否则它们也会变成抽象的。
C++ 中的纯虚函数
纯虚函数是没有定义的虚函数。它们以虚拟关键字开始,以= 0
结束。下面是纯虚函数的语法,
virtual void f() = 0;
C++ 中抽象类的例子
下面我们有一个简单的例子,我们定义了一个抽象类,
//Abstract base class
class Base
{
public:
virtual void show() = 0; // Pure Virtual Function
};
class Derived:public Base
{
public:
void show()
{
cout << "Implementation of Virtual Function in Derived class\n";
}
};
int main()
{
Base obj; //Compile Time Error
Base *b;
Derived d;
b = &d;
b->show();
}
虚拟函数在派生类中的实现
在上面的例子中,基类是抽象的,具有纯虚拟的 show() 函数,因此我们不能创建基类的对象。
为什么我们不能创建抽象类的对象?
当我们在抽象类中创建一个纯虚函数时,我们在 VTABLE 中为一个函数保留了一个槽(在上一个主题中研究过),但是没有在那个槽中放置任何地址。因此,VTABLE 将不完整。
由于抽象类的 VTABLE 是不完整的,因此编译器不会允许为这样的类创建对象,并且每当您尝试这样做时都会显示一条错误消息。
纯虚拟定义
- 可以在抽象类中给纯虚函数一个小的定义,您希望所有的派生类都有这个定义。仍然不能创建抽象类的对象。
- 另外,纯虚函数必须在类定义之外定义。如果你在类定义中定义它,编译器会给出一个错误。内嵌纯虚拟定义是非法的。
// Abstract base class
class Base
{
public:
virtual void show() = 0; //Pure Virtual Function
};
void Base :: show() //Pure Virtual definition
{
cout << "Pure Virtual definition\n";
}
class Derived:public Base
{
public:
void show()
{
cout << "Implementation of Virtual Function in Derived class\n";
}
};
int main()
{
Base *b;
Derived d;
b = &d;
b->show();
}
虚拟函数在派生类中的实现