2009-06-10 28 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?

相關問題