2009-06-10 25 views
28

在C++中,它是法律给一个纯虚函数的实现:在什么情况下给予纯虚函数的实现是有利的?

class C 
{ 
public: 
    virtual int f() = 0; 
}; 

int C::f() 
{ 
    return 0; 
} 

为什么你想这样做吗?

相关的问题:C++ faq lite包含一个例子:

class Funct { 
public: 
    virtual int doit(int x) = 0; 
    virtual ~Funct() = 0; 
}; 

inline Funct::~Funct() { } // defined even though it's pure virtual; it's faster this way; trust me 

我不明白为什么析构函数声明为纯虚然后执行;我不明白为什么这应该更快。

回答

23

声明的析构函数必须始终执行,因为实现将其称为派生对象销毁的一部分。

如果其他纯虚函数提供了有用的通用功能,但始终需要专门化,则可以实现它们。在这种情况下,通常派生类的实现将使基实现的显式调用:

void Derived::f() 
{ 
    Base::f(); 

    // Other Derived specific functionality 
} 

通常,使析构函数虚,如果你需要做一个抽象类(即防止创建非衍生的实例),但是这个类没有其他自然是纯虚拟的函数。我认为'相信我更快'是指这样一个事实,因为作为派生对象清理的一部分而被调用的析构函数不需要使用vtable查找机制,所以可以利用内联实现,而不像典型的虚函数调用。

4

如果您具有派生类可以使用的常用功能。但他们需要做其他工作。因为它被视为不良形成写

class X: public C 
{ 
    public: 
     virtual int f() 
     { 
      return C::f() + 1; // I am +1 over my parent. 
     } 
}; 
0

class Funct { 
public: 
    virtual int doit(int x) = 0; 
    virtual ~Funct() = 0 {}; 
}; 

析构函数仍将如果你叫

所以派生类实现虚函数和调用底层基础版本从这个类派生。声明纯虚拟的所有方法只是为了清楚。你可能会这样写:

class Funct { 
public: 
    virtual int doit(int x) = 0; 
    virtual ~Funct() {}; 
}; 

该类仍然是抽象的,因为至少有一种方法是纯虚拟的。析构函数也是内联的。

2

天儿真好,

关于提供在基类中声明成员函数的默认实现,我可以在那一刻想到的唯一理由是要提供行为的默认实现一个专门为基类开发的人的可能的实现选择。

派生类的作者可以选择使用基类作者提供的默认实现,而不是添加它们自己的专用实现。

通常情况下,人们反对使用单独的函数来提供行为的接口和默认实现,但他们仍然希望在默认实现和相关接口之间分离。

啊,刚才看到@马丁纽约的帖子里面提供了一个例子。

事实上,斯科特迈尔斯讨论了这个在他的著作“有效的C++”。这是第1版中的第36项。

HTH

欢呼声,

0

关于虚析这个速度是因为析构函数在CPP文件中定义,而不是报头。它的大小与速度有关。这在“大规模C++软件设计”中有详细说明。不幸的是我不记得所有的细节,但我认为,内联虚函数得到虚函数表定义多次。

这里有一个讨论: Are inline virtual functions really a non-sense?

相关问题