Renesas Synergy™

FAQ 104087 : ソースファイルによって、仮想関数が正常に呼ばれない場合があります。

Q: 質問

ソースファイルによって、仮想関数が正常に呼ばれない場合があります。

 


A: 回答  

仮想関数の有無をマクロやコンパイラオプション(-define)により 切り替えている部分が無いか ご確認下さい。
また、そのマクロやコンパイラオプションが、ソース間で共通に設定されているかをご確認ください。
例えば、下記のようなクラス定義があったとします。


class A
{
public:
#ifdef _DEBUG
virtual void debug();
#endif
virtual void func();
};
class B : public A
{
public:
#ifdef _DEBUG
virtual void debug();
#endif
virtual void func();
};

下記 test1.cpp と test2.cpp では、_DEBUG マクロの有無により動作が異なります。
基底クラスにこのような記述があっても、派生クラスのクラスメンバ変数に正常にアクセスできない場合があります。

#define _DEBUG /* あるいは、コンパイルオプションで設定している */
#include "test.h"
...
A a;
B* p = (B*)&a;
p->func();
#include "test.h"
...
A a;
B* p = (B*)&a;
p->func();


適用製品

SuperHファミリ用C/C++コンパイラパッケージ
H8SX,H8S,H8ファミリ用C/C++コンパイラパッケージ
他にご質問がございましたら、リクエストを送信してください