Здравствуйте, tyomitch, Вы писали:
T>Коллеги, возник ещё один вопрос по теме.
T>Как сделать указатель на "невидимый член" базового класса?
T>К примеру:
T>T>struct A { float w; int x; } ;
T>struct B { char y; } ;
T>struct C : public A, public B { } ;
T>B C::* p;
T>C c;
T>
T>И цель — чтобы c.*p было эквивалентно (B)c
T>Опять же, кажется, что можно изхитриться и узнать смещение предка в потомке, а по нему сконструировать указатель?
Можно, конечно. Я специально слегка усложнил — переставил местами родителей
#include "stdafx.h"
#include "stddef.h"
struct A { float w; int x; } ;
struct B { char y; } ;
struct C : public B, public A { } ;
int _tmain(int argc, _TCHAR* argv[])
{
// хочу доступ к C::A::x
C c;
B* pB = (B*)&c;
A* pA = (A*)&c;
int offsetAinC = (char*) pA - (char*) pB; // а вот в этом быть уверенным я не могу ИМХО. Или могу ? Знатоки стандарта, ответьте!
int mem = offsetAinC + offsetof(A,x) ;
int C::* p = (int C::*&) mem;
c.*p = 123;
return 0;
}
Но вообще — безобразие все это. Грязный хак, вполне согласен с rg45.