問題タブ [private-inheritance]
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++ - プライベート継承と関数からの参照を返す
今、私は以下のコードを持っています:
後でコードを追加します。
次に、VS2010 はコンパイラ エラーを通知します: エラー C2243: '型キャスト': 'CEnv *' から 'Env &' への変換が存在しますが、アクセスできません。
私の意見では、プライベート ヘリットを使用する場合は関係がないため、エラーを表示するのは正しいことです。しかし、最初のコード パターンはうまく機能します。なぜだろう?
c++ - プライベートに継承されたメンバー関数へのバインド
派生クラスで宣言を使用してstd::bind
「パブリック」にした、プライベート基本クラスからメンバー関数を作成したいと思います。using
関数を直接呼び出すと機能しますが、メンバー関数ポインターをバインドまたは使用するとコンパイルされないようです。
上記のエラー メッセージを見ると、問題Derived::foo
はまだ であり、外部からBase::foo
アクセスできないようBase
です。Derived
Derived
これは矛盾しているようです。直接呼び出し、バインドされた関数、および関数ポインターを同じ意味で使用できないようにする必要がありますか?
または(所有していないライブラリにある) を変更せずfoo
に、Derived
オブジェクトにバインドできるようにする回避策はありますか?Base
Derived
c++ - using 宣言の奇妙な動作
次のコードを見てください
gcc 6.1、clang 3.8 、および msvc 2015 update 3 のすべては、これをコンパイルすることを拒否A
します。gcc はのデフォルト コンストラクタを参照しているようです。msvc と clang はそうではないようです。C
A
B
A
using base_type = A
A
おそらく、コンパイル エラーは、継承によってトリガーされた名前の挿入が原因である可能性があります (すべてのコンパイラが正常に動作するように変更using base_type = A
するため)。using base_type = ::A
より具体的には、
- 私が理解したように、 のよう
A::type
に、A
は単なるクラス名 (gcc はそれを関数名と誤解しますが) であり、C
内部A
ではなく、またはに導入されB
ます。この名前が のプライベートと見なされるのはなぜB
ですか? - このコンパイル エラーはバグと見なすべきですか、それとも標準の仕様の特殊なケースですか?
c++ - 私的に派生した子型にキャストする方法は?
以下は、 のセマンティクスを変更して共有ポインタを実装する試みですoperator==
。
std::make_shared
このタイプに相当するものを実装するのに苦労しています。これは私の試みです:
これは機能しません: コンパイラ ( g++ 5.4.0
) は無効なキャストについて文句を言います。なぜ機能しないのですか? このキャストの代わりに何をすべきですか?
c++ - プライベート基本クラスへの 3 つの明示的なアップキャストの違い
プライベートに継承された基本クラス オブジェクトと子オブジェクトの間に次の 3 つの型キャストがあります。そのうちの 2 つは機能しますが、最後の 1 つは機能しません。何が異なる結果をもたらすのか疑問に思っています。
a
'*this' と同じではありませんか? どちらもオブジェクトなので? では、なぜ No.1 が機能するのでしょうか。
範囲のせいなら、なぜNo.2が機能するのですか?それらの間の違いを生むそれぞれの背後にあるメカニズムを誰か説明してもらえますか?
また、最初のメソッドは文字列オブジェクトを作成するようです。private 継承の場合、基底クラス参照を派生クラス オブジェクトに設定することはできません。では、一時的な文字列オブジェクトはどのように作成されるのでしょうか?
前もって感謝します。
c++ - プライベート基本クラスから静的メソッドを呼び出す方法は?
サードパーティ ライブラリのレイアウトにより、次のようなコードがあります。
MSVC でコンパイラ エラー C2247 が発生します。
Base::SomeStaticMethod にアクセスできません。Derived1 がプライベートを使用して Base から継承しているためです。
Base
プライベート指定子のため、継承を介してメンバーにアクセスできないことはわかっていますが、との間の継承関係に関係なく、 -Derived2
の静的メソッドを呼び出すことができるはずです。
あいまいさを解決し、静的メソッドを呼び出しているだけであることをコンパイラに伝えるにはどうすればよいですか?Base
Base
Derived2