基类的成员指针

时间:2010-01-31 17:28:44

标签: c++ inheritance casting pointers member

所有。我无法理解为什么以下代码需要强制转换才能工作。有人可以解释一下吗?

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?

2 个答案:

答案 0 :(得分:4)

因为如果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

因此,指向成员的指针既不是协变也不是逆变,而是不变的:类型必须完全匹配。

答案 1 :(得分:0)

好的,我得到了你的观点克里斯,但你的第一个例子适用于普通指针。为什么它对成员指针也不起作用?请参阅下面的代码。

Derived obj;
Base *ptr = &obj;

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

第二个示例即使对于普通指针也不起作用,因为没有强制转换不允许向下转换。所以我认为这不应该是一个解释。