C++ 中的抽象类和纯虚函数

原文:https://www.studytonight.com/cpp/abstract-class-and-pure-virtual.php

抽象类是至少包含一个纯虚函数的类。抽象类用于为其子类提供接口。继承抽象类的类必须为纯虚函数提供定义,否则它们也将成为抽象类。


抽象类的特征

  1. 抽象类不能被实例化,但是指针和抽象类类型的引用可以被创建。
  2. 抽象类可以有普通函数和变量以及一个纯虚函数。
  3. 抽象类主要用于上播,使其派生类可以使用其接口。
  4. 继承抽象类的类必须实现所有纯虚函数,否则它们也会变成抽象的。

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();
}

虚拟函数在派生类中的实现