仮想デストラクタ(2)

修正案その1
昨日のコメントの通り。

class ClassID{
public:
    enum EType{
        Hoge ,
        Hogehoge ,
    };
};

class Base{
public:
    virtual ~Base(){}
    virtual ClassID::EType GetID() = 0;
};

class Hoge{
public:
    virtual ClassID::EType GetID(){
        return ClassID::Hoge;
    }
};

class Hogehoge{
public:
    virtual ClassID::EType GetID(){
        return ClassID::Hogehoge;
    }
};


修正案その2
Factory を通じてオブジェクトを生成するようにする。

class ClassID{
public:
    enum EType{
        Hoge ,
        Hogehoge ,
    };
};

class Factory;

class Base{
public:
    virtual ClassID::EType GetID(){ return _id; }
protected:
    Base(){}
    virtual ~Base(){}
private:
    void SetID( ClassID::EType id ){ _id = id; }
    ClassID::EType    _id;
    
    friend class Factory;
};

class Hoge{
    friend class Factory;
};

class Hogehoge{
    friend class Factory;
};

class Factory{
    static Base* Create( ClassID::EType id ){
        Base* p = null;
        switch( id ){
        case ClassID::Hoge:     p = new Hoge();     break;
        case ClassID::Hogehoge: p = new Hogehoge(); break;
        }
        if( p != null ){
            p->SetID( id );
        }
        return p;
    }
    static void Release( Base* p ){
        delete p;
    }
};

ただ、この方法だと Factory を friend にするのがめんどうなのと、引数付きのコンストラクタ呼び出しがめんどうになります(´・ω・`)


自分が考えつくのはこれぐらいなんですが、他に良い方法があればコメントにお願いしますm(__)m