22

定数フィールド (コンパイル後に変更できないクラスに関連付けられた一意の ID など) を持つ基本クラスが必要です。これまでのところ、static const宣言は問題ありません。ここで、この基本クラスを継承し、このクラスの子が同じフィールドを持ち、独自の値を持つことを確認したいと思います。これどうやってするの?

たとえば、0 の値を保持BaseするIDフィールドで呼び出される基本クラスが必要だとします。次に、クラス、およびをすべてパブリックの子として作成したいと考えています。これらの子にも、それぞれの値が 1、2、3 のフィールドがあることを確認します (「確認する」とは、ID が明示的に宣言されていない場合にコンパイラ エラーが発生するようなものです)。intABCBaseID

このシナリオをなんとか構築できた場合ID、ポインターのフィールドを要求するBase*と、ポインターが として作成されたかnew A()new B()またはとして作成されたかに応じて、異なる値が得られるはずnew C()です。

ID私の推測では、 asを宣言することになりますがvirtual static const、これはもちろん意味がなく、コンパイラ エラーが発生します。

しかし、説明した結果を達成するにはどうすればよいでしょうか? (私が想像できる唯一のことはID、整数を返す仮想関数として宣言し、その値を関数本体にハードコーディングすることですが、もっとエレガントなものを探しています。)

前もって感謝します!

4

2 に答える 2

21

staticメソッドを。にすることはできません。virtualまた、データメンバーを。にすることはできませんvirtual

ただしstatic、派生クラスのフィールドを非表示にし、virtualメソッドを使用してそれらを返すことができます。

class A
{
public:
    static const int ID = 0;
    virtual int getID() { return A::ID; }
};
class B : A
{
public:
    static const int ID = 1;
    virtual int getID() { return B::ID; }
};

別:

class A
{
public:
    A(int id = 0) : ID(id) {}
    const int ID;
    getID() { return ID; }
};
class B : public A
{
public:
    B() : A(1) {}
};
于 2012-06-06T13:52:52.050 に答える