アプリ版:「スタンプのみでお礼する」機能のリリースについて

C++の勉強をしています。
参考書を元に以下のようなコードを書き、実行したところエラーが発生しました。
原因が分かる方がいれば教えて頂けないでしょうか?
よろしくお願いします。

[環境]
Windows XP
Visual Stadio .NET
----------------コード-------------------
#include "stdafx.h"
#include "test.h"
#include <stdio.h>
#include <string>
#include <vector>
#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// 唯一のアプリケーション オブジェクトです。

CWinApp theApp;

using namespace std;

class W1
{
public:
virtual int GetData() {return 10;}
};

class W2 :public W1
{
public:
int GetData() {return 100;}
};

void update(W2 *p)
{
if (p == NULL) return;
int iData = 0;
iData = p->GetData();
printf("%d\n", iData);
}

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
W2 w2;
W1 *pw = &w2;

int iData = 0;
iData = pw->GetData();

//Cスタイルのキャスト。
//ここでは問題なし。
update((W2*)pw);
    
//C++スタイルでのキャスト
//この関数の中に入ろうと
//とすると、エラーになる。           
update(dynamic_cast<W2*>(pw));

return 0;
}
-----------------------------------------------------
[エラー内容]
test.exe の 0x7c812a5b でハンドルされていない例外が発生しました : Microsoft C++ exception: __non_rtti_object @ 0x0012fe18。

A 回答 (2件)

# CWinApp theApp;があるのに、_tmainもある?



その版のVCでは、デフォルトのプロジェクト設定でRTTIがOFFになっていて、
その状態でdynamic_cast等を使ってはいけないのですが、
ちゃんと"GR"の設定変更してますか。
# C言語スタイルのキャストは何も考えずに無理矢理変換するだけなので、
# このオプションは無関係です。

また、MSDN(マニュアル)も見てますか。__non_rtti_objectの説明があります。

> なにゆえ update の引数を W2* にしているのしょうか?
同感です。

参考URL:http://msdn2.microsoft.com/en-us/library/cby9kyc …
    • good
    • 0

コンソールアプリケーションにして、もう少しコードを最小限に絞ったらどうでしょう。


このコードのままでもエラーにはならないような気がします。

それにしても、GetData() を virtual 宣言しているのになにゆえ update の引数を W2* にしているのしょうか?
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!