struct parent
{
char a;
char b;
};
struct child
{
struct parent parent;
int c;
char d;
};
struct grandchild
{
struct child child;
long e;
};
void print_parent_val(struct parent *p)
{
printf("%d\n", p->a);
}
int main (int argc, char **argv)
{
struct grandchild g;
g.child.parent.a = 69;
print_parent_val((struct parent *)&g);
return 0;
}
該程序編譯(無警告)並運行正常,並按預期打印69
。我從來沒有見過任何實現這種繼承技術的代碼,所以我很猶豫要把它看成「OK」。這個C繼承實現是否包含未定義的行爲?
編輯:如何將孫子轉換爲小孩?中期轉換也有可能嗎?
void print_parent_val(struct child *c)
{
printf("%c\n", c->d);
}
int main (int argc, char **argv)
{
struct grandchild g;
g.child.parent.a = 69;
g.child.d = 'w';
print_parent_val((struct child *)&g);
return 0;
}
這是衆所周知的類型雙關嗎?像在Win32中一樣,'NMHDR'和第一個memeber是指向'NMHDR'的結構?我不確定 – stackptr
您可能還想看看與您的問題有關的'man 3 offsetof'。 –
你可能從來沒有見過實現這種技術的代碼,但是我已經寫了*這樣的代碼。基於Sourav在他的回答中提出的基本相同的論點,在使自己確信其行爲是明確的之後。我相信,我離第一個寫這樣的代碼還很遠。 –