問題タブ [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++ - C++ プライベート仮想継承の問題
次のコードでは、クラス C は仮想継承のために必要な A のコンストラクターにアクセスできないようです。それでも、コードはコンパイルおよび実行されます。なぜそれが機能するのですか?
さらに、Aからデフォルトのコンストラクターを削除すると、たとえば
それから
(予期せず)コンパイルされますが、
予想どおり、コンパイルされません。
「g++ (GCC) 3.4.4 (cygming special, gdc 0.12, using dmd 0.125)」でコンパイルしたコードですが、他のコンパイラでも同様に動作することが確認されています。
c++ - C++ の例外と std::exception からの継承
このサンプル コードを考えると:
次の出力が得られます。
my_exception_t
ただし、 fromを継承するだけでstd::exception
public
、次の出力が得られます。
この場合、継承のタイプが重要な理由を誰かに説明してもらえますか? 標準の参照のためのボーナス ポイント。
c++ - 誤ったプライベート基本クラスにアクセスできませんか?
g++ 4.2.1 を使用してこのコードをコンパイルします。
私は得る:
ただし、wrap_rep
使用するクラスを変更するとST
:
それはうまくコンパイルされます。または、元のコードを次のように変更すると:
また、正常にコンパイルされます。私には、元のコードはそのままで問題ないようです。これは g++ のバグですか? そうでない場合、なぜテンプレートの使用が機能するのでしょうか? そして、他のケースでは、なぜ::S
必要なのですか?
c++ - プライベート継承とスワップ
私は、非常に関連性の高い 2 つのクラスの実装にプライベート継承を使用しています。はusing Base::X;
非常に便利でエレガントです。ただし、基本クラスの swap 関数を再利用するための洗練された解決策が見つからないようです。
これまでのところ、私が思いつくことができる唯一のことは、A::swap
の定義をConst_A::swap
の定義にコピーアンドペーストすることです。
プライベート基本クラスのスワップを再利用するエレガントなソリューションはありますか?
私がここでやろうとしていることを実装するためのよりクリーンな方法はありますか (クラスの const ラッパー)?
c++ - C++ でのプライベート継承とパブリック継承の同時実行
クラスがクラスY
をパブリックに継承するとしX
ます。クラスがパブリックに継承しながらZ
プライベートに継承することは可能ですか?Y
X
これをより明確にするために、パブリック メソッドと をX
定義するとします。メソッドを継承し、オーバーライドし、提供します。C++ では、3 番目のクラスをサブクラス化して、その実装をプライベートに利用できるようにすることができますが、外部の世界では、それがパブリックに継承されている、つまりパブリック メソッドが 1 つしかないことがわかりますか?x1
x2
Y
X
x1
y
Z
Y
Y
x1
y
X
x2
c++ - プライベート継承: 名前検索エラー
コンパイルされない次のコード例があります。
gcc が出力するエラーは次のとおりです。
test.cpp:6: エラー: `class my::base1' にアクセスできません
test.cpp:17: エラー: このコンテキスト内
これで、何が問題なのか推測できます。 の宣言を見るとprint
、コンパイラはが の基本クラスのサブオブジェクトであることを認識して判断しますが、あなたはそれにアクセスできません! 私はそれが単なる型名であるべきだと思っていますが。base1
base1
derived* this
base1
C++ 標準で、これが正しい動作であり、コンパイラのバグではないことを確認するにはどうすればよいですか (バグではないと確信しています。チェックしたすべてのコンパイラはそのように動作しました)。
このエラーを修正するにはどうすればよいですか? 以下の修正はすべて機能しますが、どれを選択すればよいですか?
void print(クラスbase1* ポインター) {}
void print( ::my:: base1* ポインタ) {}
クラス base1; void print(base1* ポインタ) {}
編集:
c++ - コンポジションに対して C++ のプライベート継承を使用するのはいつですか?
構成よりもプライベート継承を使用する方が望ましい具体例を教えてください。個人的には、プライベート継承よりもコンポジションを使用しますが、特定の問題に対してはプライベート継承を使用することが最善の解決策である場合があります。C++ faqを読むと、プライベート継承の使用例が得られますが、プライベート継承よりも構成 + 戦略パターンまたはパブリック継承を使用する方が簡単なようです。
c++ - プライベート継承:基本クラス(純粋仮想メソッドを持っている)のオブジェクトを作成するにはどうすればよいですか?
次のコードを検討してください。
上記のコードでは、「Derived」タイプのオブジェクトを作成できます。C ++を使用すると、Derivedクラスの「someMethod()」からメソッド「methodDefinedInBase()」にアクセスできます。しかし、「Base」タイプのオブジェクトを作成するにはどうすればよいですか?
ありがとう、
ヴィシュヌ。
c++ - 抽象(純粋な仮想)クラスからプライベートに継承することは意味がありますか?
この構成を想定します
さて、このようにインターフェースからプライベートに継承することには、何か有用なシナリオがあるのだろうかと思います。
c++ - プライベート ベースを持つ関数メンバー ポインター
次のコードでは、コンパイル時エラーが発生します。
'
base::print
': クラス 'base_der
'で宣言されたプライベート メンバーにアクセスできません
ただし、public
派生クラスでメンバーを作成しました。なぜこれが機能しないのですか?