enumの継承について – プログラミング – Home

通知
すべてクリア

[解決済] enumの継承について


niit
 niit
(@niit)
ゲスト
結合: 18年前
投稿: 7
Topic starter  

こんにちは。
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


引用未解決
トピックタグ
keichan
 keichan
(@keichan)
ゲスト
結合: 18年前
投稿: 28
 

flag = hoge::aaa;


返信引用
tetrapod
 tetrapod
(@tetrapod)
ゲスト
結合: 21年前
投稿: 830
 

派生クラス側の名前が優先され、基底クラス側の名前が隠蔽される典型例だね。
どうなれば期待の動作なのか良くわからんが、妄想するに
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();
}
};
で十分だと思うが、どうよ。


返信引用
niit
 niit
(@niit)
ゲスト
結合: 18年前
投稿: 7
Topic starter  

回答ありがとうございます。
無名のenumの利用をやめる方向で変更します。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました