問題タブ [name-hiding]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 明示的なスコープ解決なしでは、親クラスの親のメソッドにアクセスできないのはなぜですか?
このコードを考えてみましょう:
インラインの非仮想メソッドがクラスexec
に表示されないのはなぜですか?device_uart
c++ - 継承された非仮想関数を非表示にする名前の代替
この設計上の問題があります。コードの一部で直接アクセスされるいくつかのメンバーをラップするために使用される 2 つの単純な構造体 (ベースには、示されているよりも多くのメンバーがあります)。基本クラスには、これらのメンバーを集約する関数があります。派生クラスはさらにいくつかのメンバーを定義し、関数はそれらのメンバーをベースの集約の結果に集約します。集約関数は大きなループで呼び出されるため、仮想関数は望ましくなく、メインに示されている問題を引き起こします。foo が呼び出されると、同じオブジェクトが異なる動作をします (同じオブジェクト ベースと派生バージョンで異なる関数が呼び出されるため)。 . メンバーがコード内で直接アクセスされていない場合に適切なプライベート継承を使用するなど、いくつかの代替案を検討しました。
java - これは、オーバーライドされていないメソッドがサブクラス オブジェクトで呼び出されたときのことを指しますか?
次のコードを検討してください。
いくつかの質問を聞きたいんです。
サブクラスのオブジェクトを作成すると、実際にいくつのオブジェクトが作成されますか? 1つだけ、サブクラスで定義された新しいプロパティを導入してスーパークラスのプロパティを拡張しますか? または 2 つ、アクセスできるサブクラス オブジェクトと、その存在が私たちから隠されているスーパークラス オブジェクトですか?
2 つのオブジェクトが作成された場合、オーバーライドされていないメソッドがサブクラス オブジェクトで呼び出されたときに、どちらのオブジェクトが担当しますか? 言い換えれば、
this
オーバーライドされていないメソッド内では何が参照されているのでしょうか? 非表示のスーパークラス オブジェクトまたはサブクラス オブジェクト?#2の答えがスーパークラスの隠しオブジェクトである場合、上記のコードがinside を出力
"I am Employee"
する 理由。System.out.println("I am " + getClass().getSimpleName());
printClassName
#2の答えがサブクラスのオブジェクトである場合、なぜ内部の最初の行が
printClassName
出力されるの"I am Person"
ですか?
c++ - 静的関数継承のための名前隠蔽の意図的な使用
私は基本クラスBase
といくつかのサブクラスを持っていBaseDerivate1
ます.. BaseDerivateN
. 私のコードの一部はジェネリックであり、 define を介して使用されたクラスにアクセスすることにより、サブクラスのいずれかをサポートしていますBASE_DERIVATE
。
ここで、子クラスが宣言できる静的関数を追加する必要がありますが、宣言する必要はありません。を宣言する派生クラスについてはStaticFunc()
、それを呼び出したいと思います。それ以外の場合は、フォールバック関数を呼び出したいと思いますBase::StaticFunc()
。呼び出しは次のようになります。
そこで、ここでは意図的に名前を非表示にしています。StaticFunc
がクラス内から呼び出されることはありません。私が持っている質問は、これは C++ 標準でサポートされているのか、それとも一部のコンパイラでコンパイラ エラーが発生するのかということです。また、「静的継承」を行うためのより良い方法はありますか? しかし、私は定義のBASE_DERIVATE
概念にこだわっています。
c++ - 非仮想基本クラス関数と派生クラスの非実装仮想関数の使用の違い
この質問は、仮想関数のオーバーライドと非仮想関数の非表示の違いは何ですか?に少し関連しています。、しかし、私は技術的な詳細についてではなく、非仮想関数と仮想関数の使用について尋ねています。
ここで少し背景を説明します。基本クラス A と 2 つの派生クラス B および C があるとします。
これにより、予想どおり、次のように出力されます。
派生クラスで仮想関数 bar() を実装しないままにしておくと、派生クラス B および C での bar() への呼び出しはすべて A::bar() に解決されます。非仮想関数である xorp() は、派生クラスから b.xorp() または bA::xorp() として呼び出すこともできます。
たとえば、B に xorp() を実装すると、A::xorp() が効果的に非表示になり、b.xorp() の呼び出しは実際には bB::xorp() の呼び出しになります。
上記の例を使用して、私の質問に行きます。派生クラスの実装に必要なヘルパー関数があるとします。
ヘルパー関数を非仮想メンバー関数 (xorp() など) にすることと、ヘルパー関数を派生クラスがオーバーライドしない仮想関数 (bar()) にすることの間に違いはありますか?
クラス オブジェクト レイアウトと VTABLE に関するこのプレゼンテーション ( https://www.cs.bgu.ac.il/~asharf/SPL/Inheritance.pptx、スライド 28 ~ 35) を読んでも、実際には違いを見つけることができませんでした。 -仮想関数とオーバーライドされていない仮想関数が同じ場所 (基本クラスの関数) を指している
これら2つのアプローチが異なる結果をもたらす例、または私が見つけていない警告がある場合、誰かが私に例を挙げてもらえますか?
c++ - C++ 継承における名前隠蔽の優先順位
ポインターから基本クラス (クラス A) への print() の呼び出しが機能し、子クラス オブジェクト (クラス C) からの print() の呼び出しが機能しないのはなぜですか?
ステートメント 1: A::print() は、A::print() から継承されたクラス C の print() 関数を呼び出す仮想関数であるため、出力として「print A」を提供します。これは、クラス C が実際に print() 関数を持っていることを証明します。
ステートメント 2: B::print(int x) は A::print() を非表示にするため、コンパイラ エラーが発生します。
ステートメント 3: コンパイル エラーが発生します。なんで?
おそらく、クラス C も B::print(int x) を継承しているため、print() がまだクラス C に隠されているためです。この場合、なぜ a->print() からの呼び出しが機能したのでしょうか?
別の質問: B::print(int x) が A::print() を子クラスで非表示にすることを指定するルールはありますか?