こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

仮想関数と継承について

#include <iostream>
using namespace std;

class AAA {
public:
virtual aaa() { cout <<"aaa(void)"<<endl;}
};

class BBB : public AAA {
public:
virtual aaa(int a) { cout <<"aaa(int)"<<a<<endl;}
};

int main() {
BBB bbb;
bbb.aaa();<--これがエラーになります。
return 0;
}

どうして、既定クラスの引数なしのaaa()はよぶことが
できないのでしょうか?

投稿日時 - 2005-11-29 20:03:52

QNo.1809461

困ってます

質問者が選んだベストアンサー

> どうして、既定クラスの引数なしのaaa()はよぶことが
> できないのでしょうか?

C++の名前検索の仕様がそのようになっています。
外側の有効範囲(スコープ)で宣言された名前と同じ名前を内側の有効範囲で宣言した場合には、外側の有効範囲の名前にアクセスできなくなります。名前の検索ルールですので、メンバ関数でなくても、データメンバでも型名でも同じことがいえます。

ちょうど、

int main()
{
 int A = 1;
 {
  long A = 2;
  cout << A << endl;
 }
}

とすると、2が出力されるのと理屈は同じです。
この例では、1に初期化されたAに内側からアクセスする方法はありませんが、クラス有効範囲や名前空間有効範囲の場合には、有効範囲解決演算子 :: を使えば、アクセスできるようになります。(#2の回答の通り)

投稿日時 - 2005-11-30 00:51:32

お礼

ありがとうございます。
理論的にご説明いただき理解できました。

投稿日時 - 2005-11-30 09:28:34

ANo.3

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.4

BBB bbb;
AAA *ap=&bbb;
ap->aaa();
とかしたらどうでしょう

投稿日時 - 2005-11-30 02:09:07

お礼

ご回答いただいたときにはよくわかってなかったのですが、いろいろしらべていくうちに上記の方法が
理解できました。ありがとうございました。

投稿日時 - 2005-11-30 09:55:20

ANo.2

bbb.AAA::aaa();
と明示的に呼ぶことは可能です。

投稿日時 - 2005-11-29 21:41:42

ANo.1

クラスBBBでのaaaの定義がクラスAAAでのaaaの定義を隠します。
オーバーロード(多重定義)は同じクラスで定義する場合でないと有効になりません。

投稿日時 - 2005-11-29 21:27:34

補足

ありがとうございます。
>オーバーロード(多重定義)は同じクラスで定義する場>合でないと有効になりません。
というのは、以下のようにメソッドの引数を変えても、同じクラス内でないと多重定義としてみとめられず、基本クラスのaaa()を隠してしまうということで
あってますでしょうか?
aaa()
aaa(int a)

投稿日時 - 2005-11-29 21:31:38

お礼

ありがとうございました。

投稿日時 - 2005-11-30 09:29:39