C++ 抽象类和纯虚函数



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

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



抽象类的特点

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


C++ 中的纯虚函数

纯虚函数是只有声明而没有定义的虚函数,它们以 virtual 关键字开头,以 = 0 结尾,这是纯虚函数的语法。

virtual void f() = 0;

C++ 抽象类示例

下面我们有一个简单的例子,我们定义了一个抽象类

//抽象类
class Base          
{
public:
    virtual void show() = 0;    // 纯虚函数
};

class Derived:public Base
{
public:
    void show()
    { 
        cout << "在子类中实现纯虚函数\n"; 
    }
};

int main()
{
    Base obj;   //编译错误
    Base *b;
    Derived d;
    b = &d;
    b->show();
}

以上实例输出结果:

在子类中实现纯虚函数

在上面的示例中,基类是抽象类,具有纯虚拟 show() 函数,因此我们无法创建基类的对象。

为什么我们不能创建抽象类的对象?

当我们在抽象类中创建一个纯虚函数时,我们在 虚函数表 中为函数保留了一个槽(在上一节中介绍过),但没有在该槽中放置任何地址,因此 虚函数将是不完整的。

由于抽象类的虚函数表不完整,因此编译器不会允许为此类创建对象,并且在你尝试这样做时会提示编译错误。



纯虚拟定义

  • 纯虚函数可以在抽象类中给出一个小的定义,你希望所有的派生类都有,你仍然不能创建抽象类的对象。
  • 此外,纯虚函数必须在类定义之外定义,如果你在类定义中定义它,编译器会报错,内联纯虚定义是非法的。
// 抽象类
class Base         
{
public:
    virtual void show() = 0;     //纯虚函数
};

void Base :: show()     // 纯虚函数的实现
{
    cout << "纯虚函数的实现\n";
}

class Derived:public Base
{
public:
    void show()
    { 
        cout << "在派生类中实现纯虚函数\n"; 
    }
};

int main()
{
    Base *b;
    Derived d;
    b = &d;
    b->show();
}

以上实例输出结果:

在派生类中实现纯虚函数