問題タブ [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.

0 投票する
3 に答える
3986 参照

c++ - C++ プライベート仮想継承の問題

次のコードでは、クラス C は仮想継承のために必要な A のコンストラクターにアクセスできないようです。それでも、コードはコンパイルおよび実行されます。なぜそれが機能するのですか?

さらに、Aからデフォルトのコンストラクターを削除すると、たとえば

それから

(予期せず)コンパイルされますが、

予想どおり、コンパイルされません。

「g++ (GCC) 3.4.4 (cygming special, gdc 0.12, using dmd 0.125)」でコンパイルしたコードですが、他のコンパイラでも同様に動作することが確認されています。

0 投票する
2 に答える
9130 参照

c++ - C++ の例外と std::exception からの継承

このサンプル コードを考えると:

次の出力が得られます。

my_exception_tただし、 fromを継承するだけでstd::exception public、次の出力が得られます。

この場合、継承のタイプが重要な理由を誰かに説明してもらえますか? 標準の参照のためのボーナス ポイント。

0 投票する
3 に答える
1227 参照

c++ - 誤ったプライベート基本クラスにアクセスできませんか?

g++ 4.2.1 を使用してこのコードをコンパイルします。

私は得る:

ただし、wrap_rep使用するクラスを変更するとST:

それはうまくコンパイルされます。または、元のコードを次のように変更すると:

また、正常にコンパイルされます。私には、元のコードはそのままで問題ないようです。これは g++ のバグですか? そうでない場合、なぜテンプレートの使用が機能するのでしょうか? そして、他のケースでは、なぜ::S必要なのですか?

0 投票する
2 に答える
228 参照

c++ - プライベート継承とスワップ

私は、非常に関連性の高い 2 つのクラスの実装にプライベート継承を使用しています。はusing Base::X;非常に便利でエレガントです。ただし、基本クラスの swap 関数を再利用するための洗練された解決策が見つからないようです。

これまでのところ、私が思いつくことができる唯一のことは、A::swapの定義をConst_A::swapの定義にコピーアンドペーストすることです。

プライベート基本クラスのスワップを再利用するエレガントなソリューションはありますか?

私がここでやろうとしていることを実装するためのよりクリーンな方法はありますか (クラスの const ラッパー)?

0 投票する
5 に答える
228 参照

c++ - C++ でのプライベート継承とパブリック継承の同時実行

クラスがクラスYをパブリックに継承するとしXます。クラスがパブリックに継承しながらZプライベートに継承することは可能ですか?YX

これをより明確にするために、パブリック メソッドと をX定義するとします。メソッドを継承し、オーバーライドし、提供します。C++ では、3 番目のクラスをサブクラス化して、その実装をプライベートに利用できるようにすることができますが、外部の世界では、それがパブリックに継承されている、つまりパブリック メソッドが 1 つしかないことがわかりますか?x1x2YXx1yZYYx1yXx2

0 投票する
1 に答える
322 参照

c++ - プライベート継承: 名前検索エラー

コンパイルされない次のコード例があります。

gcc が出力するエラーは次のとおりです。

test.cpp:6: エラー: `class my::base1' にアクセスできません

test.cpp:17: エラー: このコンテキスト内

これで、何が問題なのか推測できます。 の宣言を見るとprint、コンパイラはが の基本クラスのサブオブジェクトであることを認識して判断しますが、あなたはそれにアクセスできません! 私はそれが単なる型名であるべきだと思っていますが。base1base1derived* thisbase1

C++ 標準で、これが正しい動作であり、コンパイラのバグではないことを確認するにはどうすればよいですか (バグではないと確信しています。チェックしたすべてのコンパイラはそのように動作しました)。

このエラーを修正するにはどうすればよいですか? 以下の修正はすべて機能しますが、どれを選択すればよいですか?

void print(クラスbase1* ポインター) {}

void print( ::my:: base1* ポインタ) {}

クラス base1; void print(base1* ポインタ) {}


編集:

0 投票する
3 に答える
4608 参照

c++ - コンポジションに対して C++ のプライベート継承を使用するのはいつですか?

構成よりもプライベート継承を使用する方が望ましい具体例を教えてください。個人的には、プライベート継承よりもコンポジションを使用しますが、特定の問題に対してはプライベート継承を使用することが最善の解決策である場合があります。C++ faqを読むと、プライベート継承の使用例が得られますが、プライベート継承よりも構成 + 戦略パターンまたはパブリック継承を使用する方が簡単なようです。

0 投票する
3 に答える
268 参照

c++ - プライベート継承:基本クラス(純粋仮想メソッドを持っている)のオブジェクトを作成するにはどうすればよいですか?

次のコードを検討してください。

上記のコードでは、「Derived」タイプのオブジェクトを作成できます。C ++を使用すると、Derivedクラスの「someMethod()」からメソッド「methodDefinedInBase()」にアクセスできます。しかし、「Base」タイプのオブジェクトを作成するにはどうすればよいですか?

ありがとう、

ヴィシュヌ。

0 投票する
5 に答える
859 参照

c++ - 抽象(純粋な仮想)クラスからプライベートに継承することは意味がありますか?

この構成を想定します

さて、このようにインターフェースからプライベートに継承することには、何か有用なシナリオがあるのだろうかと思います。

0 投票する
3 に答える
568 参照

c++ - プライベート ベースを持つ関数メンバー ポインター

次のコードでは、コンパイル時エラーが発生します。

' base::print': クラス ' base_der'で宣言されたプライベート メンバーにアクセスできません

ただし、public派生クラスでメンバーを作成しました。なぜこれが機能しないのですか?