#include <stdio.h>
class A {
protected:
int *a;
public:
A(int *p) : a(p) { fprintf(stdout, "A::A(int *)\n"); }
~A() { fprintf(stdout, "A::~A()\n"); }
void pa() { fprintf(stdout, "&A::a = %x\n", &a); }
};
class B : public virtual A {
public:
B(int *p) : A(p) {}
void pb() { pa(); }
};
template <int N = 2>
class C : public B {
protected:
int c[N];
public:
C() : A(c), B(c) {
for (int i = 0; i < N; i++)
c[i] = 1;
}
void pc() {
pb();
for (int i = 0; i < N; i++)
fprintf(stdout, "&C::c[%d] = %x\n", i, &c[i]);
}
};
C<> c;
int main(void) {
fprintf(stdout, "&c = %x, sizeof(C<>) = %d\n", &c, sizeof(C<>));
const int *cptr = (int *)(void *)&c;
for (int i = 0; i < sizeof(C<>)/sizeof(int); i++)
fprintf(stdout, "cptr[%d] = %x\n", i, cptr[i]);
c.pc();
return 0;
}