虚函数和纯虚函数之间的区别

时间:2010-04-16 10:33:51

标签: c++ function pure-virtual

  

可能重复:
  C++ Virtual/Pure Virtual Explained

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

我知道“Pure Virtual Function是一个没有身体的虚拟功能”,但这意味着什么,以及下面这一行实际完成的内容:

virtual void virtualfunctioname() = 0

4 个答案:

答案 0 :(得分:236)

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

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

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

结尾
class Base {
  // ...
  virtual void f() = 0;
  // ...

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

C ++的一个有趣的“特性”是一个类可以定义一个具有实现的纯虚函数。 (What that's good for is debatable。)


请注意,C ++ 11为deletedefault关键字带来了新的用法,它们看起来类似于纯虚函数的语法:

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

有关deletedefault的使用情况的详细信息,请参阅this questionthis one

答案 1 :(得分:29)

对于虚函数,您需要在基类中提供实现。但是,派生类可以使用自己的实现覆盖此实现。通常,对于纯虚函数,不提供实现。您可以在函数声明结束时使用=0创建一个纯虚函数。此外,包含纯虚函数的类是抽象的,即您无法创建此类的对象。

答案 2 :(得分:19)

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

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

class AbstractBase
{
    virtual void PureVirtualFunction() = 0;
}

然后,如果没有实现纯虚函数,则无法声明和实例化子类:

class Derived : public AbstractBase
{
    virtual void PureVirtualFunction() override { }
}

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

答案 3 :(得分:8)

在C ++中你实际上可以provide implementations of pure virtual functions。唯一的区别是所有纯虚函数必须在派生类实现之前由派生类实现。