#include <stdio.h>
struct Base {
int num;
#define DEFAULT_BASE() {.num =1}
};
struct DerivedA{
struct Base base;
int a;
#define DEFAULT_DERIVEDA() {DEFAULT_BASE() , .a = 2}
};
struct DerivedB{
struct Base base;
int b;
#define DEFAULT_DERIVEDB() {DEFAULT_BASE() , .b = 2}
};
struct DerivedA instA = DEFAULT_DERIVEDA();
struct DerivedB instB = { DEFAULT_BASE() , .b = 3 };
void func(struct Base * p){
p->num++;
}
void Base_Print(struct Base * obj){
}
void DeriveA_Print(struct DerivedA * obj){
Base_Print(obj);
}
void DeriveB_Print(struct DerivedB * obj){
Base_Print(obj);
}
int main() {
func(&instA);
func(&instB);
DeriveA_Print(&instA);
DeriveB_Print(&instB);
//printf("A->num:%d , a:%d\nB->num:%d , b:%d" , instA.base.num , instA.a , instB.base.num , instB.b );
}
I2luY2x1ZGUgPHN0ZGlvLmg+CnN0cnVjdCBCYXNlIHsKICAgIGludCBudW07CiAgICAjZGVmaW5lIERFRkFVTFRfQkFTRSgpIHsubnVtID0xfQp9OwoKc3RydWN0IERlcml2ZWRBewogICAgc3RydWN0IEJhc2UgYmFzZTsKICAgIGludCBhOwogICAgI2RlZmluZSBERUZBVUxUX0RFUklWRURBKCkge0RFRkFVTFRfQkFTRSgpICwgLmEgPSAyfQp9OwoKc3RydWN0IERlcml2ZWRCewogICAgc3RydWN0IEJhc2UgYmFzZTsKICAgIGludCBiOwogICAgI2RlZmluZSBERUZBVUxUX0RFUklWRURCKCkge0RFRkFVTFRfQkFTRSgpICwgLmIgPSAyfQp9OwoKc3RydWN0IERlcml2ZWRBIGluc3RBID0gREVGQVVMVF9ERVJJVkVEQSgpOwpzdHJ1Y3QgRGVyaXZlZEIgaW5zdEIgPSB7IERFRkFVTFRfQkFTRSgpICwgLmIgPSAzIH07Cgp2b2lkIGZ1bmMoc3RydWN0IEJhc2UgKiBwKXsKICAgIHAtPm51bSsrOwp9Cgp2b2lkIEJhc2VfUHJpbnQoc3RydWN0IEJhc2UgKiBvYmopewoJcHJpbnRmKCJudW06JWQgIiAsIG9iai0+bnVtKTsKfQoKdm9pZCBEZXJpdmVBX1ByaW50KHN0cnVjdCBEZXJpdmVkQSAqIG9iail7CglwcmludGYoIkEtPiIpOwoJQmFzZV9QcmludChvYmopOwoJcHJpbnRmKCIsIGE6JWRcbiIgLCBvYmotPmEpOwp9Cgp2b2lkIERlcml2ZUJfUHJpbnQoc3RydWN0IERlcml2ZWRCICogb2JqKXsKCXByaW50ZigiQi0+Iik7CglCYXNlX1ByaW50KG9iaik7CglwcmludGYoIiwgYjolZFxuIiAsIG9iai0+Yik7Cn0KCgppbnQgbWFpbigpIHsKICAgIGZ1bmMoJmluc3RBKTsKICAgIGZ1bmMoJmluc3RCKTsKICAgIERlcml2ZUFfUHJpbnQoJmluc3RBKTsKICAgIERlcml2ZUJfUHJpbnQoJmluc3RCKTsKCS8vcHJpbnRmKCJBLT5udW06JWQgLCBhOiVkXG5CLT5udW06JWQgLCBiOiVkIiAsIGluc3RBLmJhc2UubnVtICwgaW5zdEEuYSAsIGluc3RCLmJhc2UubnVtICwgaW5zdEIuYiApOwp9