問題タブ [vptr]
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++ - 仮想継承の派生クラスのサイズ
私が得た出力は次のとおりです。
上記のコードでは、ClassD の出力が 16 である理由です。この仮想継承がどのように機能するかを明確に説明してください。
java - インターフェイスを追加すると C++ オブジェクトのサイズが大きくなります... Java はこれを行いますか?
C++ で Java のインターフェイスを模倣するための小さな実験を行っています。
基本クラス「Base」から継承する「Derived」クラスと、2 つのインターフェイスがあります。継承元のインターフェイスごとに、派生クラスのサイズが大きくなることに気付きました。これは、vptr ごとにより多くのスペースを追加する必要があるためです。これは私には非常に高価に思えるので、主な質問が 2 つあります。
- C++ で Java のインターフェイスを模倣するより良い方法はありますか?
- Java のオブジェクト サイズは、インターフェイスを実装するたびに大きくなりますか?
私が使用しているコードは次のとおりです。
c++ - オブジェクトをコピーすると vptr が破棄されるのはなぜですか?
例
gcc でコンパイルすると、teachers[0] の vtable ポインターがゼロになります。また、uncle の vtable ポインターは、上書きされるのではなく、元の値を保持します。私の質問: なぜそのようになったのですか? CLEAN の回避策はありますか? 私は一緒に行くことができますuncle._vptr=ifather->_vptr
か?オブジェクトをコピーする通常のルーチンは何ですか? バグを報告する必要がありますか?注: プラットフォームに依存しないオブジェクト全体をコピーする必要があります。これは、オブジェクト タイプの識別がどのように行われても、常にオブジェクトのデータ ブロック内にある必要があるためです。
記事
私を助けませんでした、それは別の理由があるに違いありません。
c++ - C++ - コンストラクターなしで基本クラス vptr を設定しますか?
C++ でメモリ マネージャーを作成しました。詳細は重要ではありませんが、セットアップ時にヒープから大きなバイト配列を割り当て、その割り当て関数が呼び出されると、一部の空きメモリ バイトを 0 にクリアし、それらへのポインタを返します。したがって、使用例は次のようになります。
これはうまく機能します。私は徹底的にテストしましたが、意図したとおりに機能します。ただし、「偽の」ポインターを作成するだけなので、オブジェクトのコンストラクターは呼び出されません。これは、別のクラスから継承するクラスを割り当てようとするとバラバラになります。その vptr は設定されません。これは、コンストラクターの開始時に行われ、プログラマーから隠されているためです。そのため、基本クラスの関数を呼び出すとすぐに、プログラムがセグ フォールトでクラッシュします。
これを回避する方法はありますか?自分で設定できますか?
編集:これを行う方法を探している他の人には、「placement new」を検索してください。詳細については、コメントをお読みください。
c++ - 仮想機能メカニズムの実装
最初:仮想関数のメカニズムが未定義であることをどこかで読みました。つまり、すべてのコンパイラが異なる方法で実装できることを意味します。しかし、仮想機能メカニズムについて私が見つけたすべてのテキストは、VTBL と VPTR について語っています。
別の仮想機能メカニズムの実装はありますか? いくつか例を挙げていただけますか?
2 番目: 異なる言語での VTBL 実装の違いは何ですか?
c++ - デフォルトのコンストラクターと明示的に宣言されたコンストラクターを使用した Vptr
コンパイラは、VPTR を初期化するコードをコンストラクタの先頭に挿入します。この操作は、コンストラクターがデフォルトのものであるか、明示的に宣言されているかによって影響を受けますか? 両者に違いはありますか?