0

私は C++ クラス FooCpp、C++ インターフェイス IFOO、および Obj-c クラス FooObjC を IFOO に持っています。

public:
    virtual ~IFOO() {};
    virtual void seePointer(FooCpp* p);

私が持っているFooCppで:

.h で

class FooCpp : virtual public IFOO {
public:
    virtual ~FooCpp() {};
    void seePointer(FooCpp* p);
}

および.cpp

void FooCpp::seePointer(IFOO* p){
    printf("%p\n",p);
}

FooObjC では、次のように呼び出します。

FooCpp *foo = new FooCpp();
FooCpp *f = new FooCpp();
printf("%p\n",f);
foo->seePointer(f);

そして、私がこれを行うと、次のログが取得されます。

0x848f520
0x61630002

なぜポイントアドレスが変更されたのですか?これは私のプログラムでエラーが発生するため、誰かがこれの理由と修正方法を知っていますか?

4

1 に答える 1

0

特に仮想継承が関係している場合、ベースサブオブジェクトが完全なオブジェクトとは異なるアドレスを持つことは珍しいことではありません。

ただし、2つのポインタの差は小さくする必要があります(。未満)sizeof (FooCpp)

ある種の破損(おそらく呼び出し規約の不一致)があるか、Objective-C ++がプロキシオブジェクトのティアオフなど、本当に奇妙なことを行っています。

于 2012-11-08T20:55:17.337 に答える