0

私は以下のようなコードスニペットを持っています:

class ClassA
{
public:
    virtual ~ ClassA() {};
    virtual void FunctionA() {cout << "ClassA" << endl;}
};
class ClassB
{
public:
    virtual void FunctionB() {};
};
class ClassC : public ClassA, public ClassB
{
public:
    void FunctionA(){cout << "why" << endl;}
    void FunctionB(){cout << "class C funb" << endl;}
};

ClassC aObject;
ClassA* pA = &aObject;
ClassB* pB = &aObject;
ClassC* pC = &aObject;

int main()
{
    void* pvoid = static_cast<void *> (pB);
    ClassA* pA2 = static_cast<ClassA*>(static_cast<ClassC*>(pB));

    return 0;
}

型キャストはpvoid正しいpA2ですか?それとも両方とも間違っていますか?(私はそれをコンパイルしようとしましたが、エラーはありません)

4

2 に答える 2

0

「正しい」が何を意味するかによって異なりますが、どちらの定義も合法であり、明確に定義されたセマンティクスを持っています。pvoidは のClassBサブオブジェクトを指しaObjectpA2はそのClassAサブオブジェクトを指します。

于 2013-04-09T07:26:23.470 に答える
0

pvoidClassBのサブオブジェクトのアドレスをaObject型なしポインターとして提供するという意味で「正しい」です。あなたがそれでできる唯一の有用なことは、それを にキャストすることですClassB*。ここでのキャストは冗長であることに注意してください。これは、任意のポインターが暗黙的に に変換される可能性があるためvoid*です。

pA2ClassAのサブオブジェクトを指すように正しく初期化されますaObject。これは「クロスキャスト」であるため (つまり、どちらの型も他の型から派生していませんが、どちらも何らかの派生クラスの基底クラスです)、派生型を介して変換する必要がありますdynamic_cast。派生型はコンパイル時に不明です。

于 2013-04-09T07:26:37.317 に答える