基本クラスのメンバにアクセスできないのですが

[戻る]
SunPac 2003/10/24(金) 13:01:33
以前、ある人から質問された事がありまして、問題自体は解決したのですが、
どうしても気になっている事があります。
というのは、

class A{
public:
    void func() { cout << "A::func()" << endl; }
};

class B : public A{
public:
    void func(int i) { cout << "B::finc(int)" << endl; }
};

int main()
{
    B obj;

    obj.func(); //  <- エラーになる

    return 0;
}

つまり基本クラスのメンバ関数と同じ名前の関数を派生クラスでオーバーロードしている
のですがどうもエラーが出ます。
対処法としては
  ((A)obj).func()
とするか、Bに
    void func() { A::func(); }
を加えるかで何とかなるのは分かっているのですが、これってVC++6のバグなのでしょう
か?
エラーメッセージは
'func' : 関数が不正な 0 個の実引数をともなって呼び出されました。
です。

まぁ、こんな継承する事自体あまりないのですけどね・・・

επιστημη [E-Mail] [HomePage] 2003/10/24(金) 13:09:01
> これってVC++6のバグなのでしょうか?

バグではありません。言語仕様です。

yukihiro 2003/10/24(金) 13:49:12
そんなときは
obj.A::func()
と書きます。

tetrapod 2003/10/24(金) 14:51:59
class B: public A {
  using A::func;
  ...
};
とする手もあります。

SunPac 2003/10/24(金) 18:02:47
[[解決]]
みなさん、お答えありがとうございます。
なんと言語仕様でしたか。それは知りませんでした。
私もまだまだ修行がたりませんねぇ。
obj.A::func()って書き方は分かりやすくてGoodです。
using A::funcはちょっと意表をつかれたって感じかも(笑)

やはりちゃんと言語使用には目を通した方がよさそうですね。
でも昨日の int[0]とかこれって今はやりのトリビアってやつかも。
思わずへぇって頷いちゃったし。

古いスレッドには追加発言できません。