2012-02-28 5 views
2

純粋な仮想クラスを1つ、たとえば1つ以上の非純粋仮想関数で作成する場合、実装ファイルの作成をスキップしてクラスの定義をスキップできますか?純仮想関数と正規関数を持つクラスで定義が必要ですか?

非仮想機能がある場合は同じですか?私は推測していません...

+1

私はあなたがそれらを呼び出そうとしない限り、実際に宣言されたメンバ関数を定義する必要はないと思います。そして、リンカは不平を言うでしょう。それはあなたが求めていることですか?種別: – jrok

+0

基本的に抽象クラスの定義を完全にスキップできるかどうかを知りたかったのですが、とにかくインスタンスを生成することはありません。 – SirYakalot

+0

同様に、非抽象クラスの定義をスキップすることもできます;)抽象クラスをインスタンス化できないことを忘れないでください。 – Alecs

答えて

4

すべてのメンバ関数をインラインで定義することによって、常にクラスをヘッダー専用にすることができます。これは、関数が仮想であるかどうかには関係ありません。さらに、ヘッダーファイルには、ほとんどの場合既にクラス定義が含まれています(フォワード宣言を使用している場合を除きます)。

クラス宣言:

class C; 

つのメンバー関数を持つクラス定義:

:インラインで定義されている一方の部材の機能を有する

class C { 
    void f(); 
}; 

クラス定義用語を明確にする

class C { 
    void f() { ... } 
}; 

3つのスタイルはすべて、さまざまな状況で可能であり、有用です。クラステンプレートでは、第3のスタイルを使用して任意のインスタンス化を許可することがよくあります。多くのコードを持つ通常のクラスでは、オブジェクトコードのサイズとコンパイル時間が減るため、2番目のスタイルが一般的です。

0

基本クラスに純粋仮想関数の定義を作成することはできませんが、通常の関数定義を作成する必要があります。基本クラスに純粋な仮想メソッドを定義することは意味をなさない。

また、クラスが抽象クラス(純粋な仮想関数で構成されている場合)である場合は、そのクラスを継承する必要があります。また、抽象クラスのオブジェクトを作成することもできません。

編集部:

class A{ 
public: 
    int a; 

    virtual void vDisplay() = 0; //Should not be defined in base class and must be defined in the derived class 
    virtual int vGet(); //non pure Virtual function 
    void vSetA(int x); //non virtual member function must be defined 
}; 
class B:public A{ 
    int b; 
public: 
    void vDisplay(); //should be defined in derived class 
    int vGet(); 
    void vSetB(int x,int y); 
}; 
int A::vGet(){ 
    return a; 
} 
void A::vSetA(int x){ 
    a = x; 
} 
void B::vDisplay(){ 
    cout<<"a="<<a<<"b="<<b; 
} 
int B::vGet(){ 
    return a; 
} 
void B::vSetB(int x, int y){ 
    a = x; 
    b = y; 
} 
+1

私はかなり慣習に反していますが、実際には純粋な仮想の定義を作成できます。 – SirYakalot

+0

@SirYakalot:規約に従って、基本クラスに純粋仮想関数を定義すべきではありません。 – Abhineet

+0

クラス本体の中で純粋な仮想を定義することはできませんが、 'void A :: vDisplay(){}'を実行できます。純粋な仮想デストラクタが必要な場合は、実際に行う必要があります。 – jrok

1

あなたが任意のメンバーを呼び出すことはありませんまで、あなたはあなたのクラスが抽象的でない場合であっても、その宣言をする必要はありません。

オペレータがこのクラスで使用されないようにするために、非公開で宣言せずにいくつかの演算子を禁止するのは良い方法です。

関連する問題