私はC構造体から派生したクラスを持っています。このクラスは、コンストラクタの初期化、デストラクタ中の初期化解除関数、およびC関数を呼び出すその他のいくつかのメソッド以外の特別なことはしません。基本的に、それは普通のラッパーです。 GCCを使って、私のデストラクタは仮想ではないと訴えたので、私はそれを作った。今私はsegfaultsに走ります。構造体から派生したクラスの仮想関数
/* C header file */
struct A
{
/* ... */
}
// My C++ code
class B : public A
{
public:
B() { /* ... init ... */ }
virtual ~B() { /* ... deinit ... */ }
void do()
{
someCFunction(static_cast<A *>(this));
}
};
私はstatic_cast
は、仮想テーブルポインタをオフ剪定、基底クラスへの正しいポインタを返すという前提の下で常にでした。だから私はC関数でセグメンテーションを取得するので、これは当てはまりません。
キーワードvirtual
を削除することで、コードは正常に動作しますが、gccの警告が表示されます。これに対して最善の対策は何ですか?私を啓発しても構いません:)
A ::〜A virtualを作成できますか? –
いいえ、できません。それはパブリックなCヘッダーです。 – MarkP
構造体の代わりにクラスを使用してみませんか?違いは明らかですが、同じ目標が達成されています。 – Poni