こんにちは。
enumをもったクラスの継承で質問があります。
class hoge
{
public:
enum {aaa, bbb} flag;
virtual void f()
{
flag = aaa;
}
};
を継承したクラスで基底クラスと同じenum型変数を追加すると
コンパイルエラーが出てしまいます。
class hoge2 : public hoge
{
public:
enum {aaa, bbb} sibou_flag; //フラグを追加
virtual void f()
{
sibou_flag = aaa;
flag = aaa; //コンパイルエラー
}
};
なにかよい回避方法はないでしょうか?
環境winXP vc++6.0
flag = hoge::aaa;
派生クラス側の名前が優先され、基底クラス側の名前が隠蔽される典型例だね。
どうなれば期待の動作なのか良くわからんが、妄想するに
flag=hoge::aaa; // と書けばいいんぢゃないかな
でもこれが本当にやりたいことなのか?そうぢゃないと思う。
同一名称で、内容の異なるシンボル aaa を作りたいのであれば、やめとけ。
コンパイラは混乱しなくてもプログラマが混乱するだけだから。
同一名称で、同一内容の aaa が作りたいのであれば、二重に記述する必要は無い。
そもそも非推奨な「無名 enum」など作るのやめちゃえばいい。
struct b {
enum e_x { aaa, bbb};
e_x flag1;
virtual void f() { flag1=aaa; }
};
struct d : b {
e_x flag2;
virtual void f() {
flag2=aaa;
b::f();
}
};
で十分だと思うが、どうよ。
回答ありがとうございます。
無名のenumの利用をやめる方向で変更します。