ある種のオブジェクトファクトリ(テンプレートベース)があり、それは私の目的にはかなりうまく機能します。しかし今、私はQObjectと純粋な抽象クラス(インターフェース)の両方から派生したクラスを操作しようとしましたが、奇妙な実行時エラーが発生しました。
ここにこのクラスの簡単な図(派生)
class Interface {
public:
Interface(){}
virtual ~Interface(){}
virtual int getResult() = 0;
};
class Derived : public QObject, public Interface {
Q_OBJECT
public:
explicit Derived(QObject *parent = 0);
int getResult();
};
およびderived.cppでのその実装:
#include "derived.h"
Derived::Derived(QObject *parent)
: QObject(parent) {
}
int Derived::getResult() {
return 55;
}
voidポインターをインターフェースにキャストしようとすると、予期しない(私にとっては)動作が発生します。これは、実行時エラー、またはその他のメソッド呼び出し(クラスのサイズによって異なります)である可能性があります。
#include "derived.h"
void * create() {
return new Derived();
}
int main(int argc, char *argv[]) {
Interface * interface = reinterpret_cast<Interface *>(create());
int res = interface->getResult(); // Run-time error, or other method is called here
return 0;
}
voidポインタをインターフェイスにキャストできない理由を教えてください。そして、回避策はありますか?
ご回答ありがとうございます