[英]Pointer to member type incompatible with object type when calling a pointer to a member of a derived class
[英]Coerce pointer to member to most derived type
考虑此类型层次结构:
struct A {
int x;
};
struct B : A {
int y;
};
&B::y
的类型是int B::*
,但&B::x
的类型是int A::*
。 它可以转换为int B::*
,这是我需要的,但我需要显式执行该转换。
是否有一种方便的方法来推断类型是指向我指定的类的成员的指针? 毕竟,如果我想要A::*
到x
我可以做&A::x
。
在虚拟继承的情况下,这种转换是不可能的。 假设
struct A {
int x;
};
struct B : virtual A {
int y;
};
和两个功能,
int f(B* pB) {
int A::*pX = &A::x; // or &B::x, identical but clearer this way
return pB->*pX;
}
int g(B* pB) {
int B::*pY = &B::y;
return pB->*pY;
}
f(B*)
需要进行vtable查找以便在*pB
内找到A
实例的基指针,而g(B*)
仅将偏移应用于pB
。 因此,对象&A::x
不能表示为int B::*
类型的实例,它需要一个不同的运行时逻辑来使用指向B
的指针进行求值而不是int B::*
。
尽管B
是这里和现在派生程度最高的类,但是可以定义另一个C
类在不同的编译单元中继承A
和B
并希望将C*
传递给f()
。 因此, B
中A
的偏移量不能用于固定。
有人可能会争辩说,如果没有虚拟继承,或者在匿名命名空间中,语言可以允许转换,或者......但是可能更容易一致地禁止它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.