C++纯虚函数有体

Vij*_*jay 62 c++ pure-virtual

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

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

AnT*_*AnT 89

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

在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`
}
Run Code Online (Sandbox Code Playgroud)


Pri*_*ley 28

"有效的C++"Meyers提到了一个纯虚函数有一个正文的原因:实现这个纯虚函数的派生类可以在它们的代码中调用这个实现.如果两个不同派生类的部分代码相似,则在层次结构中将其向上移动是有意义的,即使该函数应该是纯虚拟的.

看到这里.


Chr*_*ung 8

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

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

  • (我意识到这个答案已经有一年了,但我刚看到一个链接将人们引用到这个问题,所以...)你的第一点是错误的,纯虚拟析构函数不会强制派生类实现析构函数.派生类将始终具有析构函数,即使它是隐式定义的.纯虚拟析构函数的一个优点是,如果没有其他适合纯虚拟的函数,则使类成为抽象. (12认同)