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