抽象类是一个至少包含一个纯虚函数的类,抽象类用于为其子类提供接口,抽象类的子类必须为纯虚函数提供定义,否则它们也将成为抽象类。
纯虚函数是只有声明而没有定义的虚函数,它们以 virtual 关键字开头,以 = 0
结尾,这是纯虚函数的语法。
virtual void f() = 0;
下面我们有一个简单的例子,我们定义了一个抽象类
//抽象类
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();
}
以上实例输出结果:
在派生类中实现纯虚函数