Gui*_*ach 3 c++ inheritance pointers casting 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?
Run Code Online (Sandbox Code Playgroud)
因为如果Base
被允许(协变),你就可以这样做,这是一个禁忌:
Base Class::* ptr = &Class::member;
Class obj;
obj.*ptr = Base(); // <-- assigned a Base into a Derived field?!
Run Code Online (Sandbox Code Playgroud)
同时,指向成员的指针也不能是逆变的,因为否则你可以这样做,这也是一个禁忌:
struct Class2 {
Base member;
};
Derived Class2::* ptr2 = &Class2::member;
Class2 obj2;
obj2.member = Base();
Derived& d = obj2.*ptr2; // <-- assigned a Base into a Derived
Run Code Online (Sandbox Code Playgroud)
因此,指向成员的指针既不是协变的也不是逆变的,而是不变的:类型必须完全匹配。
归档时间: |
|
查看次数: |
1268 次 |
最近记录: |