ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

C言語とC++言語コミュのvirtual function call とは、

  • mixiチェック
  • このエントリーをはてなブックマークに追加
WIN32 VC++ で、あるスタティックライブラリをリンクして、とあるソフトの plug-in をこしらえ実行したとき
--------------------
Microsoft Visual C++ Runtime Library

<プログラム名>

R6025
-pure virtual function call
--------------------
ってなダイアログが出ます。
こんなとき何を疑えば良いのでしょう。
ちなみに、このダイアログが出るコードは当該ライブラリをコンソールアプリケーションとしてリンクし実行するとちゃんと動いたりします。

コメント(9)

ヘルプのキーワード検索でR6025を検索すれば一発で出ますよ。
以下MSDNからコピペです。

> C のランタイム エラー R6025
> pure virtual function call
>
> 適切なオブジェクトに結び付けられていない純粋仮想関数が呼び出されました。
>
> このエラーは、派生クラス型へのキャストによって作成されたポインタで、
> 実際は基本クラスを指すポインタを使って抽象基本クラス中の
> 仮想関数が呼び出されたときに発生します。
> また、基本クラス生成時に生成された void* からクラスのポインタへの
> キャストが行われたときにも発生します。

なんで基底の純粋仮想関数をちゃんと派生させていないのかな〜っとも思ったのですが、スタティックリンクすると動くのですよね?
ってことはプラグイン(たぶんDLL?)のビルド時にはそのメソッドがちゃんと入っていないってことになるのでしょうか?
もしかしてヘッダーにインラインで書いてるとそうなったりするんでしょうかね?
まぁ、とにかくそこらへんを疑ってみてください。
「とあるソフト」がリリースビルドでプラグインがデバッグビルドだったりしませんか?
要求するランタイムライブラリDLLの食い違いなどで誤動作しているかも。
thisを初期化メンバリストの中で使うな、とかwarning出てませんかね。
役に立たない事しか言えないような気がしますが、発言致します。
プラグインが実装するAPIやプラグインが使用してよいホストアプリケーション側へアクセスするためのAPIは基底クラスとして提供されているのかと想像しています。
そのようなインタフェースクラスをどうやってリンクするのかを再確認するのが有効であるように思います。
> thisを初期化メンバリストの中で使うな、とかwarning出てませんかね。

ありますね。ここいら変が怪しそう。しかし、どう直したものやら。。。
コンストラクタの中ではvTableの初期化が終わっていないので
仮想関数は呼んではいけませんよね。
もしこれに該当する(コンストラクタの中で直接または間接的に仮想関数を呼んでいる)なら、可能ならクラスを分割してメンバにしてしまえば、外側のクラスのコンストラクト時にはメンバの初期化は先に行われるので安全に使えます。
他のメンバが要求するインターフェイスの場合も、やはりメンバに分割して先に初期化されるように宣言すれば良いですし。
あ、ヒントになりましたか!
純粋仮想関数をコールしてしまう処理をコンストラクタからはずしてあげるのに、メンバの作り方とか継承の仕方を変えるとかいくつか作戦ありそうですね。
相変わらずバカ予想ですいません・・・
でも「コンストラクタ内での仮想関数呼び出し問題」と
「thisを初期化メンバリストの中で使うな」というのは
同じ問題なのでしょうか?
まずコンストラクタをインラインで記述するのをやめて、
その上で「コンストラクタ内での仮想関数呼び出し問題」に
対応するのはどうでしょう?
※コンストラクタをインラインで書いていなかったらすいません。
8: ああひよひよさん
>同じ問題なのでしょうか?
仮想関数が正しく使えないという点ではおんなじようなものかと思います。

ログインすると、みんなのコメントがもっと見れるよ

mixiユーザー
ログインしてコメントしよう!

C言語とC++言語 更新情報

C言語とC++言語のメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。

人気コミュニティランキング