問題タブ [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.
haskell - Haskellモジュール:隠された名前とghci
Haskellモジュールから名前のサブセットだけをエクスポートしようとしていますが、ghciを使用すると、非表示の名前にもアクセスできます。
しかし、これをghciで試してみると、次のようになります。
私は何が間違っているのですか?
(編集:その価値のために、私はArchLinuxでghci6.12.3を使用しています)
c++ - スーパークラスの関数のオーバーロード
スーパークラスの関数をオーバーロードすることを防ぐ C++ 標準の何かがありますか?
このクラスのペアから始めます。
簡単に呼び出すことができますB::foo()
:
でも電話しようとしたらA::foo()
…
... コンパイラ エラーが発生します。
何かが欠けていないことを確認するために、B
の関数の名前を変更して、オーバーロードがないようにしました。
A::foo()
これで、2 番目の例を使用して呼び出すことができます。
これは標準ですか?g++ を使用しています。
c++ - 関数テンプレートはクラス名を隠すことができませんか?
これは GCC と Comeau で動作します:
これはコモーで壊れます:
これは両方を壊します:
ルールは §3.3.7/2 で定義されています。関数テンプレートが関数ではないという理由だけで不一致ですか? GCC の動作が理解できません。
クラス名 (9.1) または列挙名 (7.2) は、同じスコープで宣言された変数、データ メンバー、関数、または列挙子の名前によって非表示にすることができます。クラスまたは列挙名と、変数、データ メンバー、関数、または列挙子が同じスコープで (任意の順序で) 同じ名前で宣言されている場合、クラスまたは列挙名は、変数、データ メンバー、関数、または列挙子名が表示されます。
c++ - 名前の非表示と仮想関数に関する混乱
別の質問を参照する
コードを考えてみましょう:
ケース2の場合)
呼び出しobj->gogo(7)
は実行時に解決されます。
obj->gogo(7)
は合法なので。のvtableには、非表示になっているはずのDerived
ptrが含まれ
ていることを意味しているようです。virtual void gogo(int a)
私の混乱は、名前を隠すとケース1)が違法になるため、2)の呼び出しが実行時にどのように解決されるかです。
a)Derivedのvtableにはgogo(int)へのポインターが含まれていますか?
b)a)が真でない場合、仮想関数の呼び出し解決は基本クラスのvtableに進みますか。
c++ - c++ 派生クラスでオーバーロードされているテンプレート クラス関数を派生クラスから呼び出すにはどうすればよいですか?
以下で説明するように、派生クラスで基本テンプレート クラス関数をオーバーロードし、基本クラス関数を呼び出す方法はありますか?
c++ - クラスメンバー関数が同じ名前のフリー関数をシャドーするのはなぜですか?
最近、メンバー関数がクラス内で同じ名前のフリー関数を完全に隠していることに気付きました。そして完全に言うと、同じ名前のフリー関数はすべて、オーバーロード解決の対象とはまったく見なされないということです。なぜそれがこのようなもので行われるのか理解できます:
関数が同一のシグネチャを持っている場合、変数のスコープが同じように機能するため、これは当然のことです。しかし、free 関数が次のように異なるシグネチャを持つ明確な呼び出しを禁止する理由は次のとおりです。
クラス内からシャドウされたフリー関数を呼び出す方法を尋ねているのではありません。私が知りたいのは、このデザインの背後にある理論的根拠です。
c++ - 仮想関数と派生クラスに関する混乱
次のコードを理解しようとしています。
これは印刷します
正確な理由はわかりません。
最初の呼び出し d->f(3.14F) は、Derived で関数 f を呼び出します。理由は 100% わかりません。私はこれ(http://en.cppreference.com/w/cpp/language/implicit_cast)を見ました:
浮動小数点型の prvalue は、任意の整数型の prvalue に変換できます。小数部分は切り捨てられます。つまり、小数部分は破棄されます。値が宛先の型に収まらない場合、動作は未定義です
float は int に収まらないため、これを行うことはできません。この暗黙的な変換が許可されるのはなぜですか?
第二に、上記を問題ないと受け入れたとしても、b->f(3.14F) への 2 回目の呼び出しは意味がありません。b->f(3.14F) は仮想関数 f を呼び出しているため、これは動的に解決され、派生オブジェクトである b が指すオブジェクトの動的型に関連付けられた f() を呼び出します。3.14F を int に変換することが許可されているため、最初の関数呼び出しはこれが有効であることを示しているため、(私の理解では) Derived::f(int) 関数を再度呼び出す必要があります。それでも、Base クラスの関数を呼び出します。では、これはなぜですか?
編集:これが私がそれを理解し、自分自身に説明した方法です。
b は Base オブジェクトへのポインターであるため、b を使用して Base オブジェクトのメンバーにアクセスすることしかできません。たとえ b が実際に Derived オブジェクトを指していても (これは標準の OO/継承のものです)。
この規則の唯一の例外は、Base のメンバー関数が virtual として宣言されている場合です。このような場合、Derived オブジェクトはこの関数をオーバーライドし、まったく同じ署名を使用して別の実装を提供できます。これが発生すると、たまたま Base オブジェクトへのポインターを介してメンバー関数にアクセスしている場合でも、この Derived 実装が実行時に呼び出されます。
上記のコード スニペットでは、B::f と D::f のシグネチャが異なるため (一方が float、もう一方が int)、オーバーライドは行われません。したがって、b->f(3.14F) を呼び出すとき、考慮される唯一の関数は、呼び出された元の B::f です。
java - 特定の単語を隠しながらテキストを読む Java i/o
SECRET という単語が現れるたびに隠しながら、次のテキストをどのように読みますか? ここにテキストがあります:
このセリフには秘密の言葉があります。
この行には 1 つがありません。
この行には2つの秘密の言葉があります。
この行には何もありません。
c++ - コンストラクタ初期化リストに隠れている名前
次の例のように、初期化リストを使用するようにコンストラクターを変更したいと思います。
this
残念ながら、バージョン2はまだ存在していないため、データメンバーのポインターを使用できないため、バージョン2を実行できません。それでは、名前の非表示の問題に対処するにはどうすればよいですか(つまり、パラメーターとデータメンバーの名前が同じです)。
c++ - 名前の隠蔽と基底クラスの非仮想関数へのアクセス (構文)
次のコードでは:
この名前は隠れていませんか?そして、この構文は標準のどこで定義されていますか (C++11 または C++03 は関係ありません。両方の標準で同じようです)。
これが可能だとはまったく知りませんでした。そのような構文を見るのは初めてです(ここで初めて見ました:次のコードでクラス A 関数にアクセスできないのはなぜですか?)