繁体   English   中英

将指向成员的指针强制转换为大多数派生类型

[英]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在不同的编译单元中继承AB并希望将C*传递给f() 因此, BA的偏移量不能用于固定。

有人可能会争辩说,如果没有虚拟继承,或者在匿名命名空间中,语言可以允许转换,或者......但是可能更容易一致地禁止它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM