• ベストアンサー

仮想関数と継承について

#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()はよぶことが できないのでしょうか?

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

  • ベストアンサー
  • jacta
  • ベストアンサー率26% (845/3158)
回答No.3

> どうして、既定クラスの引数なしのaaa()はよぶことが > できないのでしょうか? C++の名前検索の仕様がそのようになっています。 外側の有効範囲(スコープ)で宣言された名前と同じ名前を内側の有効範囲で宣言した場合には、外側の有効範囲の名前にアクセスできなくなります。名前の検索ルールですので、メンバ関数でなくても、データメンバでも型名でも同じことがいえます。 ちょうど、 int main() {  int A = 1;  {   long A = 2;   cout << A << endl;  } } とすると、2が出力されるのと理屈は同じです。 この例では、1に初期化されたAに内側からアクセスする方法はありませんが、クラス有効範囲や名前空間有効範囲の場合には、有効範囲解決演算子 :: を使えば、アクセスできるようになります。(#2の回答の通り)

kenchan5418
質問者

お礼

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

その他の回答 (3)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.4

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

kenchan5418
質問者

お礼

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

  • sha-girl
  • ベストアンサー率52% (430/816)
回答No.2

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

  • rinkun
  • ベストアンサー率44% (706/1571)
回答No.1

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

kenchan5418
質問者

お礼

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

kenchan5418
質問者

補足

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

関連するQ&A