- ベストアンサー
仮想関数と継承について
#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()はよぶことが できないのでしょうか?
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
> どうして、既定クラスの引数なしのaaa()はよぶことが > できないのでしょうか? C++の名前検索の仕様がそのようになっています。 外側の有効範囲(スコープ)で宣言された名前と同じ名前を内側の有効範囲で宣言した場合には、外側の有効範囲の名前にアクセスできなくなります。名前の検索ルールですので、メンバ関数でなくても、データメンバでも型名でも同じことがいえます。 ちょうど、 int main() { int A = 1; { long A = 2; cout << A << endl; } } とすると、2が出力されるのと理屈は同じです。 この例では、1に初期化されたAに内側からアクセスする方法はありませんが、クラス有効範囲や名前空間有効範囲の場合には、有効範囲解決演算子 :: を使えば、アクセスできるようになります。(#2の回答の通り)
その他の回答 (3)
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
BBB bbb; AAA *ap=&bbb; ap->aaa(); とかしたらどうでしょう
お礼
ご回答いただいたときにはよくわかってなかったのですが、いろいろしらべていくうちに上記の方法が 理解できました。ありがとうございました。
- sha-girl
- ベストアンサー率52% (430/816)
bbb.AAA::aaa(); と明示的に呼ぶことは可能です。
- rinkun
- ベストアンサー率44% (706/1571)
クラスBBBでのaaaの定義がクラスAAAでのaaaの定義を隠します。 オーバーロード(多重定義)は同じクラスで定義する場合でないと有効になりません。
お礼
ありがとうございました。
補足
ありがとうございます。 >オーバーロード(多重定義)は同じクラスで定義する場>合でないと有効になりません。 というのは、以下のようにメソッドの引数を変えても、同じクラス内でないと多重定義としてみとめられず、基本クラスのaaa()を隠してしまうということで あってますでしょうか? aaa() aaa(int a)
お礼
ありがとうございます。 理論的にご説明いただき理解できました。