2009-06-10 3 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() {}; 
}; 

少なくとも1つのメソッドが純粋な仮想であるため、クラスは引き続き抽象クラスになります。デストラクタもインラインです。

2

あなたのように行動のデフォルトの実装を提供する場所やあ、基底クラスで宣言されたメンバ関数のデフォルトの実装を提供するに関する

、私は、現時点では考えることができる唯一の理由は、基本クラスを専門にしている人のための実現可能な選択肢。

派生クラスの作成者は、独自の特殊な実装を追加する代わりに、基本クラスの作成者が提供するデフォルトの実装を使用することができます。

これは、一般に、インターフェイスを提供するために別個の機能を持つことに反対し、動作の既定の実装を依然として要求していますが、依然として既定の実装と関連付けられたインターフェイスの分離が必要です。

ああ、ただ例を示す@Martin Yorkの投稿を見ました。

実際、Scott Meyersは彼の著書「Effective C++」でこれについて議論しています。第1版のItem 36です。

HTH

歓声、

4

ちょうどハーブサッターは彼のGuru of the Week #31にこの質問の最初の部分に答えていることが分かりました。

0

仮想デストラクタの速度に関しては、デストラクタはヘッダではなくcppファイルで定義されているためです。速度よりもサイズに関係します。詳細は、「大規模C++ソフトウェア設計」で説明します。残念ながら、私はすべての詳細を覚えることはできませんが、インライン仮想関数はvtableで複数回定義されると思います。

ここにディスカッションがあります。 Are inline virtual functions really a non-sense?

関連する問題