C ++纯虚函数有体

时间:2011-03-30 04:45:20

标签: c++ pure-virtual

纯虚函数(当我们设置= 0时)也可以有一个函数体。

为纯虚函数提供函数体有什么用?如果它们根本不被调用?

3 个答案:

答案 0 :(得分:86)

您无法调用纯虚函数的假设绝对不正确。当一个函数被声明为纯虚拟时,它只是意味着该函数不能通过虚拟调度机制被动态调用 。然而,这个非常相同的功能可以很容易地称为静态非虚拟直接(没有虚拟调度)。

在C ++语言中,当在调用中使用函数的限定名称时,即在调用中指定的函数名称具有<class name>::<function name>形式时,将执行对虚函数的非虚拟调用。

例如

struct S 
{
  virtual void foo() = 0;
};

void S::foo() 
{
  // body for pure virtual function `S::foo`
}

struct D : S 
{
  void foo() 
  {
    S::foo();       
    // Non-virtual call to `S::foo` from derived class

    this->S::foo(); 
    // Alternative syntax to perform the same non-virtual call 
    // to `S::foo` from derived class
  }
};

int main() 
{
  D d;

  d.S::foo(); 
  // Another non-virtual call to `S::foo`
}

答案 1 :(得分:26)

  

“有效的C ++”迈耶斯提到了一个   纯虚函数的原因   有一个身体:派生类   实现这个纯虚函数   可以在smwhere调用此实现   在他们的代码中。如果部分代码   两个不同的派生类是   类似的,移动它是有道理的   在层次结构中,即使是   功能应该是纯虚拟的。

请参阅here

答案 2 :(得分:6)

对于大多数纯虚函数,你是对的。但是,对于纯虚拟析构函数,定义相应的析构函数实现非常重要:

  • “纯虚拟”是要求派生类实现其析构函数。
  • 您的基类析构函数实现是为了派生类析构函数可以在之后成功“链接”。