現在、C++の継承で名前隠蔽を理解しようとしています。同じ名前の派生クラス関数によって基底クラス関数が隠されていなかった理由
私は継承されたメソッドを再定義すると、オーバーロードの変動はありませんが、C++プライマープラス、ページ要するに744
でこれを読みました。派生クラスで関数を再定義すると、同じ関数シグネチャで基本クラス宣言をオーバーライドするだけではありません。代わりに、引数シグネチャに関係なく、同じ名前のすべての基本クラスメソッドを非表示にします。
だから私は試してみました、ここに私の二つのクラス、ベースがあり、そして本によると
class Base{
public:
Base(){
cout << "Base::Base() called\n";
}
virtual ~Base(){}
virtual void output(int x){
cout << "Base::output(int x) called\n";
}
virtual void output(double x){
cout << "Base::output(double x) called\n";
}
virtual void output(char x){
cout << "Base::output(char x) called\n";
}
virtual void output(string x){
cout << "Base::ouput(string x) called\n";
}
};
class Derived : public Base{
public:
Derived():Base(){
cout << "Derived::Derived() called\n";
}
virtual ~Derived(){}
virtual void output(string x){
cout << "Derived::ouput(string x) called\n";
}
};
を派生、void Base::output(string x)
が再定義され、同じ名前を持つ他のすべてのメンバ関数が非表示になります。
しかし、次の2つのコードは、異なるストーリーを示しています。
Derived* x = new Derived();
x->output(7);
予想通り、このコードはコンパイルできない、エラーメッセージが
ある
'文字列' から 'INT' からノー実行可能な変換しかし、私はこのように行う場合、
Base* x = new Derived();
x->output(7);
魔法のように働いて、次の出力を与えました:
ベース::ベース()派生
と呼ばれる::派生()
ベースと呼ばれる::出力(int型x)は、これが起こる可能性がなぜ、ポインタ型が実際に影響を与えない
と呼ばれます見上げる? Btw、これはXcodeにありました。
'output(string)'関数はどちらも "Derived :: output(string)"を出力します。 – kfsone
@kfsone申し訳ありません、それはタイプミスでした – Curtis2