【问题标题】:C++ pure virtual function have body [duplicate]C ++纯虚函数有主体[重复]
【发布时间】:2011-07-25 19:31:47
【问题描述】:

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

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

【问题讨论】:

  • 对不起!我对这个论坛上的术语有些陌生。我已经接受了我认为正确的答案。感谢您的建议。

标签: c++ pure-virtual


【解决方案1】:

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

在 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`
}

【讨论】:

    【解决方案2】:

    “Effective C++”迈耶斯提到了一个 纯虚函数的原因 有一个主体:派生类 实现这个纯虚函数 可以在哪里调用这个实现 在他们的代码中。如果部分代码 两个不同的派生类是 类似然后移动它是有意义的 在层次结构中,即使 函数应该是纯虚函数。

    here

    【讨论】:

    • 该死...我有第 12 版的 Effective C++,但我错过了那句话。我认为,定义它的一个原因是因为它可能会被调用并且默认抛出可能不是你想要的软件......(当然,重用代码也是一个很好的理由)。跨度>
    【解决方案3】:

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

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

    【讨论】:

    • (我意识到这个答案已经有一年了,但我刚刚看到一个链接将人们提到这个问题,所以......)你的第一点是错误的,纯虚拟析构函数不会强制派生类来实现析构函数。派生类总是有一个析构函数,即使它是隐式定义的。纯虚析构函数的一个优点是,如果没有其他适合纯虚函数的类,则可以将其抽象化。
    猜你喜欢
    • 2012-08-27
    • 1970-01-01
    • 2012-06-03
    • 1970-01-01
    • 2012-03-20
    • 1970-01-01
    • 2013-12-08
    • 2015-11-30
    相关资源
    最近更新 更多