2011-07-22 13 views
6

一部の書籍では、仮想関数を宣言または継承するクラスを多相クラスと呼びます。多型C++

クラスBには仮想関数はありませんが、複数の関数を渡すのはテストです。

クラスCには1つの仮想関数がありますが、継承しません。

class A {}; 
class B : public A {}; 

class C 
{ 
public: 
    virtual void f() {} 
}; 

は、クラスBまたはCの多型であるか?

+0

私は宿題のように聞こえ、atleastタグを付け加えてください:p – KaiserJohaan

答えて

2

class CC&dynamic_castまたはtypeidを使用すると、実行時の型チェックを行うことを意味し、仮想ディスパッチを使用しますC&またはC*を通じてメンバ関数を呼び出して、多型です。

(もちろん、AS-場合のルールは、あなただけのオブジェクトを作成したときのように、それは事前にランタイム型を知っている場合、コンパイラは、いくつかの条件の下での実行時の発送を避けることができます。)


@Billコメントで述べたように、それはいくつかの本と言うだけで何ではありません、それはC++標準(セクション10.3、[class.virtual])で見つかった多型クラスの定義です:

仮想関数は、動的バインディングサポートオブジェクトとオブジェクトテッドプログラミング。 仮想関数を宣言または継承するクラスは、多相クラスと呼ばれます。

3

標準では、「仮想関数を宣言または継承するクラスはポリモーフィッククラス」と呼ばれています。

AでもBも仮想関数を宣言または継承しないため、これらは多態性ではありません。 Cは仮想関数を宣言しているため、多型です。はっきり

8

2003: 10.3/1状態、:

宣言するまたは仮想関数はポリモーフィッククラスと呼ばれる継承したクラス。

あなたは実際にこれをあなた自身、言葉の言葉で言ったので、私は本当にその質問が何であるか分かりません。

C(それを追加した場合はその子孫)は多型です。 ABはありません。広いOOPの意味で、あなたは常にそのCに一部「多型」を実行することができ、


注++常にあなたがアップキャストすることができます。したがって継承するすべてのオブジェクトは、異なる(しかし関連する)タイプとして扱うことができます。

しかし、用語「多型」とは、かどうかをすることができます意気消沈同様に行うことがより多くを持っているC++、わずかに異なって定義されます。C++標準のように混乱させたくない場合は、この「動的多形性」と呼ぶかもしれません。

+0

しかし、ポリモーフィッククラスの場合、デストラクタは仮想でなければなりません。ここではクラスには仮想デストラクタがありません。 –

+1

@Aditya:はい、する必要があります。ただし、仮想デストラクタがない場合でも、クラスが多態的になることはありません。 –

+0

@Aditya:多形的に削除される場合のみ。非常に多くのクラスは決してありません。 –