关于C++:虚函数与纯虚函数的区别

Difference between a virtual function and a pure virtual function

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
C++ Virtual/Pure Virtual Explained

纯虚函数和虚函数有什么区别?

我知道"纯虚函数是一个没有实体的虚函数",但这是什么意思,下面这行实际做了什么:

1
virtual void virtualfunctioname() = 0


虚函数使其类成为多态的基类。派生类可以重写虚拟函数。通过基类指针/引用调用的虚拟函数将在运行时解析。也就是说,使用对象的动态类型而不是其静态类型:

1
2
3
4
 Derived d;
 Base& rb = d;
 // if Base::f() is virtual and Derived overrides it, Derived::f() will be called
 rb.f();

纯虚函数是一个虚函数,其声明以=0结尾:

1
2
3
4
class Base {
  // ...
  virtual void f() = 0;
  // ...

纯虚函数隐式地为抽象定义类(与Java不同,其中有一个关键字来显式声明类抽象)。无法实例化抽象类。派生类需要重写/实现所有继承的纯虚拟函数。如果他们不这样做,他们也会变得抽象。

C++的一个有趣的"特性"是,类可以定义一个具有实现的纯虚函数。(这对什么有好处是有争议的。)

请注意,C++ 11为EDCOX1、2、EDCX1、3个关键字带来了新的用途,它看起来类似于纯虚拟函数的语法:

1
2
my_class(my_class const &) = delete;
my_class& operator=(const my_class&) = default;

有关使用deletedefault的更多信息,请参阅本问题和本问题。


对于虚拟函数,需要在基类中提供实现。然而,派生类可以用它自己的实现重写此实现。通常,不提供纯虚拟函数的实现。在函数声明结束时,可以使用=0使函数纯虚拟。此外,包含纯虚拟函数的类是抽象的,即不能创建此类的对象。


纯虚函数通常不能(但可以)在基类中实现,必须在叶子类中实现。

您通过在声明中附加"=0"来表示这一事实,如下所示:

1
2
3
4
class AbstractBase
{
    virtual void PureVirtualFunction() = 0;
}

如果不实现纯虚拟函数,则无法声明和实例化子类:

1
2
3
4
class Derived : public AbstractBase
{
    virtual void PureVirtualFunction() override { }
}

通过添加override关键字,编译器将确保存在具有相同签名的基类虚拟函数。


您可以在C++中提供纯虚函数的实现。唯一的区别是,所有纯虚拟函数都必须由派生类实现,然后才能实例化类。