タイトルの通り、
スーパークラスのprotectedな変数を初期化リストで初期化する方法を教えていただけないでしょうか。
具体的には、
class SuperClass{
protected:
int superId;
};
class SubClass : public SuperClass{
private:
SubClass(Int id);
}
SubClass::SubClass(int id)
:/* ここでSuperClassのsuperIdを初期化したい、どう記述するのか?? */
{}
よろしくお願いいたします。
SuperClassに引数付きのコンストラクタを作成しておいて
初期化子でそれを呼ぶのが一般的だと思います。
class SuperClass{
public:
SuperClass(int id) { superId = id; }
protected:
int superId;
};
class SubClass : public SuperClass {
private:
SubClass(int id);
};
Subclass::SubClass(int id)
: SuperClass(id)
{
};
無理です。
基底クラスのメンバの初期化は,
コンストラクタ以外の方法で手を付ける事はできません。
#protectedメンバ変数って,ほとんど使った事がない……。
PATIOさん、YuOさん回答ありがとうございます。
あくまで、SuperClassには手をつけないで(つけられない)ので
初期化は無理なんですね・・・(涙
おとなしく代入いたします。
ありがとうございました。
推測:
質問の例が実際に問題となっている物と異なっている。
# protectedメンバなんだから、普通の変数ならば、
# 子であろうが、孫であろうが途中で、privateに
# 変更してない限り、普通にアクセスできるでしょ?
ありゃ、誤爆?
> # protectedメンバなんだから、普通の変数ならば、
> # 子であろうが、孫であろうが途中で、privateに
> # 変更してない限り、普通にアクセスできるでしょ?
アクセスはできるけれど,書き込めるとは限らないですよ。
参照だったりconstだったり……。
> # protectedメンバなんだから、普通の変数ならば、
> # 子であろうが、孫であろうが途中で、privateに
> # 変更してない限り、普通にアクセスできるでしょ?
質問の主旨は「初期化リストで初期化する方法/初期化したい」であって、
その後に「おとなしく代入いたします。」ですから、
アクセス権の話は無関係かと思います。
# 更新したら YuO さんのレスが...orz
YuOさん へ
まぁね。
Banさん へ
その通りだけど、代入ですむ事をなぜ初期化リストで
行いたいかが書かれてなかったので。
> 代入ですむ事をなぜ初期化リストで
> 行いたいかが書かれてなかったので。
初期化リストで済むことをなぜ代入で? という考え方もありますぜ。
ツイート | ![]() |