C++ 指向基类的成员指针

C++ 指向基类的成员指针,c++,inheritance,casting,pointers,member,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 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?

因为如果
Base
是允许的(协变的),那么您就可以这样做,这是不允许的:

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

obj.*ptr=Base();// 好的,我明白你的意思了,克里斯,但是你的第一个例子适用于普通指针。为什么它不适用于成员指针呢?参见下面的代码

Derived obj;
Base *ptr = &obj;

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

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

我以前从未见过这种语法;有人把我和它的意思联系起来,在谷歌上搜索这些东西是不可能的。这是一个指向成员的指针。:-)使用“添加注释”功能向答案添加注释,或编辑您的问题,而不是发布非答案。这与他的第一个示例不同。不能使用普通指针说
Derived*obj=Base()
,因为
Base
不是
Derived
。如果
派生的
具有不在
基中的
某个点
,该怎么办?那么当
obj
Base
时,当您执行
obj->someInt
时会发生什么呢?这不是很有说服力。您可以使用普通指针将基类指定给派生类(否则将不允许将派生类指针强制转换为基类指针),所以为什么不使用成员指针呢?
Derived obj;
Base *ptr = &obj;

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