2011-03-30 107 views
37

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

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

+0

[实施与纯虚函数]的可能重复(http://stackoverflow.com/questions/2089083/pure-virtual-function-with-implementation) – 2011-03-30 08:13:51

+0

抱歉!我对这个论坛的条款有点新鲜。我已经接受了我所发现的正确答案。感谢suggesssions。 – Vijay 2011-03-31 06:55:30

+0

[纯虚函数与实现]可能重复(https://stackoverflow.com/questions/2089083/pure-virtual-function-with-implementation) – finnw 2017-05-31 12:29:09

回答

59

你假设纯虚函数不能被调用是绝对不正确的。当一个函数被声明为纯虚函数时,它仅仅意味着该函数不能通过虚拟调度机制动态调用。然而,这个非常相同的功能可以很容易地被称为静态,没有虚拟调度。当在呼叫中使用的函数的一个合格的名称被执行以一个虚函数

在C++语言静态调用,当在呼叫指定的功能的名称具有即<class name>::<function name>形式。

例如

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

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

struct D : S { 
    void foo() { 
    S::foo(); // static call to `S::foo` from derived class 
    } 
}; 

int main() { 
    D d; 
    d.S::foo(); // another static call to `S::foo` 
} 
4

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

  • “纯虚拟”是要求派生类实现其析构函数。
  • 您的基类析构函数的实现使派生类的析构函数可以成功地“连锁”。
+8

(我意识到这个答案是一岁,但我只是看到一个链接指向这个问题的人,所以...)你的第一点是错误的,一个纯粹的虚拟析构函数不强制派生类实现析构函数。派生类将始终具有析构函数,即使它是隐式定义的。纯虚拟析构函数的一个优点是,如果它没有其他适合纯虚拟函数的函数,则将它作为抽象类。 – 2012-05-28 18:01:21

19

“有效的C++”迈尔斯提到的理由为纯虚函数 有身体:派生类 实现这个纯虚函数 可以调用这个实现在自己的代码smwhere 。如果部分代码 有两个不同的派生类是 类似,那么即使 函数应该是纯虚拟的,它在层次结构中向上移动 也是有意义的。

参见here