Здравствуйте, B0FEE664, Вы писали:
BFE>BFE>#include <stdio.h>
BFE>struct I1
BFE>{
BFE> virtual void show()=0;
BFE>};
BFE>struct I2
BFE>{
BFE> virtual void print()=0;
BFE>};
BFE>struct A : I1,I2
BFE>{
BFE> int x[3];
BFE> void show() { printf("show x0=%d\n",x[0]); }
BFE> void print() { printf("print x0=%d\n",x[0]); }
BFE> I1* i1 = { this };
BFE> I2* i2 = { this };
BFE>};
BFE>void fn(I1* i) { i->show(); }
BFE>void fn(I2* i) { i->print(); }
BFE>int main(int argc, char **argv) {
BFE> A a[1];
a->>x[0]=123;
BFE> fn(a->i1);
BFE> fn(a->i2);
BFE> return 0;
BFE>}
BFE>
BFE>
Так можно было просто указатели преобразовать. Не заводя отдельных полей.
I1* get_i1() { return this; }
Хочется чего-то более структурированного
Слегка усложним. А если так:
#include <stdio.h>
template<class A,class B>A*parent_of(B*self,B A::*t) {
return (A*)((char*)self-(char*)(&(((A*)0)->*t)));
}
template<class A,class B>A*parent_of(B*self,B(A::*t)[1]) {
return (A*)((char*)self-(char*)(&(((A*)0)->*t)));
}
struct I1 { virtual void show()=0; };
struct I2 { virtual void print()=0; };
struct I3 { virtual void next()=0; virtual void print()=0; };
struct A {
int x[3];
struct :I1 {
A* parent() { return parent_of(this,&A::i1); }
void show() { printf("show x0=%d\n",parent()->x[0]); }
} i1[1];
struct :I2 {
A* parent() { return parent_of(this,&A::i2o); }
void print() { printf("print x0=%d\n",parent()->x[0]); }
} i2o[1];
struct :I2 {
A* parent() { return parent_of(this,&A::i2); }
void print() { printf("print2 x0=%d\n",parent()->x[0]); }
} i2[1];
struct :I3 {
A* parent() { return parent_of(this,&A::i3); }
void next() { printf("next3\n"); }
void print() { printf("print3 x0=%d\n",200-parent()->x[0]); }
} i3[1];
};
void fn(I1* i) { i->show(); }
void fn(I2* i) { i->print(); }
void fn(I3* i) { i->print(); }
int main(int argc, char **argv) {
A a[1];
a->x[0]=123;
fn(a->i1);
fn(a->i2);
fn(a->i2o);
fn(a->i3);
return 0;
}