struct A
{
double x[2];
double i;
};
struct B : virtual public A
{
double y[2];
};
int main(void)
{
B test;
test.x[0] = 300;
test.i = -5;
A const * const pA = &test;
B const * const pB = &test;
bool const b = reinterpret_cast<int const *>(pA)
!= reinterpret_cast<int const *>(pB); // As expected
double (B::*pmemberBBi) = &B::i;
double (B::*pmemberBBx)[2] = &B::x;
double (A::*pmemberABx)[2] = &B::x;
double const * const pBBi_B = &(pB->*pmemberBBi); // Valid pointer even though pointer to derived
double const * const pBB_B = pB->*pmemberBBx ; // Null pointer, but why if the previous line worked?
double const * const pAB_B = pB->*pmemberABx ; // Works (pointer to base)
double bbi_b = pB->*pmemberBBi ; // Works fine even though it is pointer to derived
double bb_b = (pB->*pmemberBBx)[0]; // Crash, but why if the previous line worked?
double ab_b = (pB->*pmemberABx)[0]; // Works (pointer to base)
return 0;
}
c3RydWN0IEEKewoJZG91YmxlIHhbMl07Cglkb3VibGUgaTsKfTsKCnN0cnVjdCBCIDogdmlydHVhbCBwdWJsaWMgQQp7Cglkb3VibGUgeVsyXTsKfTsKCmludCBtYWluKHZvaWQpCnsKCUIgdGVzdDsKCXRlc3QueFswXSA9IDMwMDsKCXRlc3QuaSAgICA9IC01OwoKCUEgY29uc3QgKiBjb25zdCBwQSA9ICZ0ZXN0OwoJQiBjb25zdCAqIGNvbnN0IHBCID0gJnRlc3Q7Cglib29sICAgICAgY29uc3QgYiAgPSByZWludGVycHJldF9jYXN0PGludCBjb25zdCAqPihwQSkKCQkhPSByZWludGVycHJldF9jYXN0PGludCBjb25zdCAqPihwQik7IC8vIEFzIGV4cGVjdGVkCgoJZG91YmxlIChCOjoqcG1lbWJlckJCaSkgICAgPSAmQjo6aTsKCWRvdWJsZSAoQjo6KnBtZW1iZXJCQngpWzJdID0gJkI6Ong7Cglkb3VibGUgKEE6OipwbWVtYmVyQUJ4KVsyXSA9ICZCOjp4OwoKCWRvdWJsZSBjb25zdCAqIGNvbnN0IHBCQmlfQiA9ICYocEItPipwbWVtYmVyQkJpKTsgLy8gVmFsaWQgcG9pbnRlciBldmVuIHRob3VnaCBwb2ludGVyIHRvIGRlcml2ZWQKCWRvdWJsZSBjb25zdCAqIGNvbnN0IHBCQl9CICA9IHBCLT4qcG1lbWJlckJCeCAgIDsgLy8gTnVsbCBwb2ludGVyLCBidXQgd2h5IGlmIHRoZSBwcmV2aW91cyBsaW5lIHdvcmtlZD8KCWRvdWJsZSBjb25zdCAqIGNvbnN0IHBBQl9CICA9IHBCLT4qcG1lbWJlckFCeCAgIDsgLy8gV29ya3MgKHBvaW50ZXIgdG8gYmFzZSkKCglkb3VibGUgYmJpX2IgPSBwQi0+KnBtZW1iZXJCQmkgICAgOyAvLyBXb3JrcyBmaW5lIGV2ZW4gdGhvdWdoIGl0IGlzIHBvaW50ZXIgdG8gZGVyaXZlZAoJZG91YmxlIGJiX2IgID0gKHBCLT4qcG1lbWJlckJCeClbMF07IC8vIENyYXNoLCBidXQgd2h5IGlmIHRoZSBwcmV2aW91cyBsaW5lIHdvcmtlZD8KCWRvdWJsZSBhYl9iICA9IChwQi0+KnBtZW1iZXJBQngpWzBdOyAvLyBXb3JrcyAocG9pbnRlciB0byBiYXNlKQoKCXJldHVybiAwOwp9Cg==
prog.cpp: In function ‘int main()’:
prog.cpp:23:35: error: pointer to member conversion via virtual base ‘A’
double (B::*pmemberBBi) = &B::i;
^
prog.cpp:24:35: error: pointer to member conversion via virtual base ‘A’
double (B::*pmemberBBx)[2] = &B::x;
^
prog.cpp:20:18: warning: unused variable ‘b’ [-Wunused-variable]
bool const b = reinterpret_cast<int const *>(pA)
^
prog.cpp:27:23: warning: unused variable ‘pBBi_B’ [-Wunused-variable]
double const * const pBBi_B = &(pB->*pmemberBBi); // Valid pointer even though pointer to derived
^
prog.cpp:28:23: warning: unused variable ‘pBB_B’ [-Wunused-variable]
double const * const pBB_B = pB->*pmemberBBx ; // Null pointer, but why if the previous line worked?
^
prog.cpp:29:23: warning: unused variable ‘pAB_B’ [-Wunused-variable]
double const * const pAB_B = pB->*pmemberABx ; // Works (pointer to base)
^
prog.cpp:31:9: warning: unused variable ‘bbi_b’ [-Wunused-variable]
double bbi_b = pB->*pmemberBBi ; // Works fine even though it is pointer to derived
^
prog.cpp:32:9: warning: unused variable ‘bb_b’ [-Wunused-variable]
double bb_b = (pB->*pmemberBBx)[0]; // Crash, but why if the previous line worked?
^
prog.cpp:33:9: warning: unused variable ‘ab_b’ [-Wunused-variable]
double ab_b = (pB->*pmemberABx)[0]; // Works (pointer to base)
^