66

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

如果根本不调用纯虚函数,那么为纯虚函数提供函数体有什么用?

4

3 回答 3

95

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

在 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`
}
于 2011-03-30T04:56:38.223 回答
29

“Effective C++”Meyers 提到了纯虚函数有一个主体的原因:实现这个纯虚函数的派生类可以在其代码中的某个地方调用这个实现。如果两个不同派生类的部分代码相似,那么将其在层次结构中向上移动是有意义的,即使函数应该是纯虚拟的。

这里

于 2011-03-30T04:51:21.587 回答
8

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

  • “纯虚拟”是要求派生类实现其析构函数。
  • 您的基类析构函数实现是为了使派生类析构函数之后可以成功“链接”。
于 2011-03-30T04:48:07.110 回答