QA@IT

メンバポインタを使って、メンバの共通基底クラスへのポインタを取りたい

3124 PV

VisualStudio2010 で C++ での質問です。

メンバポインタを使って、メンバの共通基底クラスへのポインタを取りたいのですが変数代入中にエラーに成ってしまいます。
キャストもうまくいかないのですが、解決策があれば教えて下さい。

class CBase {
public:
 virtual void fn() = 0;
};

class C1 : public CBase {
public:
 virtual void fn() { ... };
};

class C2 : public CBase {
public:
 virtual void fn() { ... };
};

class Hoge {
public:
 C1 member1;
 C2 member2;
};

int main(~~) {
 CBase Hoge::* pm1 = &Hoge::member1; // ここでエラー
 CBase Hoge::* pm2 = &Hoge::member2; //  error C2440: '初期化中' : 'C1 Hoge::* ' から 'CBase Hoge::* ' に変換できません。

 Hoge hoge;
 (hoge->*pm1).fn();
 (hoge->*pm2).fn();
}

回答

reinterpret_cast だと多重継承で上手く動作しないことがあるので気をつけてー(しないと思うけど)

編集 履歴 (0)

reinterpret_castを使うのはどうでしょうか:

class CBase
{
public:
    virtual void fn() = 0;
};

class C1 : public CBase
{
public:
    void fn() {}
};

class Hoge
{
public:
    C1 member1;
};

int main(int argc, char *argv[])
{
    CBase Hoge::*pm1 = reinterpret_cast<CBase Hoge::*>(&Hoge::member1);

    Hoge hoge;
    (&hoge->*pm1).fn();

    return 0;
}
編集 履歴 (0)
  • コンパイルでき、動作も確認できました。ありがとう。

    ***_cast は仕様がよくわかっていないので避けていました。
    -
  • reinterpret_cast で上手くいかない例を書いてみましたー -
  • フォロー有難うございます。多重継承の影響までは思い至りませんでした。 -
ウォッチ

この質問への回答やコメントをメールでお知らせします。