3

全て。以下のコードが機能するためにキャストが必要な理由がわかりません。誰かがそれを説明できますか?

class Base {
};

class Derived : public Base {
};

class Class {
public:
    Derived member;
};

...

Derived obj;
Base *ptrObj = &obj; // ok, no cast needed

Derived Class::* ptr = &Class::member; // ok
Base    Class::* ptr = &Class::member; // wrong, need cast, why?
4

2 に答える 2

5

許可されている場合Base(共変)、これを行うことができるため、これはノーノーです:

Base Class::* ptr = &Class::member;
Class obj;
obj.*ptr = Base();   // <-- assigned a Base into a Derived field?!

同時に、メンバーへのポインターも反変にすることはできません。

struct Class2 {
    Base member;
};

Derived Class2::* ptr2 = &Class2::member;
Class2 obj2;
obj2.member = Base();
Derived& d = obj2.*ptr2;  // <-- assigned a Base into a Derived

したがって、メンバーへのポインターは共変でも反変でもなく、不変です。型は正確に一致する必要があります。

于 2010-01-31T17:32:03.890 に答える
0

わかりました、私はクリスの要点を理解しましたが、最初の例は通常のポインターで機能します。メンバーポインタでも機能しないのはなぜですか? 以下のコードを参照してください。

Derived obj;
Base *ptr = &obj;

*ptr = Base(); // it's weird, but ok

2 番目の例は、キャストなしではダウンキャストが許可されないため、通常のポインターでも機能しません。だからと言って説明する必要はないと思います。

于 2010-01-31T18:09:02.793 に答える