Translating derived classes relies on the first part of the dynamic structures being the same. That way a pointer to the derived class object also points to the base class part of that object.
class Base {
private:
int x,y,z;
public:
Base(int a) {
x = a;
y = z = 0;
}
void joe(int m) {
y = m;
}
};
class Derived: public Base {
private:
int q;
public:
Derived(int m, int n): Base(m) {
q = n;
}
int bill(int n) {
q += n;
return z;
}
};
main() {
int t;
Derived d(20, 30);
d.joe(5);
t = d.bill(30);
}
| struct Base_dynamic_part {
int x,y,z;
};
void Base_Base(struct Base_dynamic_part *this, int a) {
this->x = a;
this->y = this->z = 0;
}
void Base_joe(struct Base_dynamic_part *this, int m) {
this->y = m;
}
struct Derived_dynamic_part {
// Exact copy of Base_dynamic_part.
int x,y,z;
// Add new stuff.
int q;
};
void Derived_Derived(Derived_dynamic_part *this, int m, int n) {
Base_Base((Base_dynamic_part *)this, m);
this->q = n;
}
int Derived_bill(Derived_dynamic_part *this, int n) {
this->q += n;
return this->z;
}
main() {
int t;
struct Derived_dynamic_part d;
Derived_Derived(&d, 20, 30);
Base_joe((Base_dynamic_part *)&d, 5);
t = Derived_bill(&d, 30);
}
|