- vừa được xem lúc

[C language] Struct Sub-typing - Mở Rộng Struct

0 0 12

Người đăng: Semi Dev

Theo Viblo Asia

Khi sử dụng struct để mô tả các bản ghi dữ liệu mô phỏng về các thực thể, có những trường hợp nhất định khi giữa các thực thể có tính chất kế thừa các đặc tính, hiển nhiên chúng ta cũng muốn phản ánh đặc trưng kế thừa inheritance trong code thay vì tổ hợp composition. Tính năng kế thừa inheritance không được C hỗ trợ biểu thị về mặt cú pháp, tuy nhiên về mặt kĩ thuật thì mặc định là tính năng này đã được triển khai đối với các struct khi làm việc thông qua các con trỏ struct pointer.

Struct Pointer

Khi làm việc với các struct thông qua con trỏ tham chiếu, chúng ta luôn có địa chỉ của struct chính là địa chỉ của trường dữ liệu đầu tiên trong định nghĩa của kiểu struct đó.

typedef struct { char* class; char* name; int age;
} person_struct; person_struct person (char* $name, int $age); typedef person_struct* Person; Person new_Person (char* $name, int $age);
#include "Person.h" person_struct person ( char* $name, int $age
) { person_struct $primitive = { .class = "Person", .name = $name, .age = $age }; return $primitive;
} Person new_Person ( char* $name, int $age
) { person_struct $primitive = person ($name, $age); Person $reference = & ($primitive); return $reference;
}
#include <stdio.h>
#include "Person.h" void main ( int $argc, char* $argv[]
) { Person $me = new_Person ("Semi Dev_", 1001); printf ("Class: %s", $me->class); printf ("References: \n"); printf (" struct: %p", $me); printf (" .class: %p", &($me->class));
}
Class: Person
References: struct: 0x7ffd01db6890 .class: 0x7ffd01db6890

Backward Casting

Điều này có nghĩa là nếu như chúng ta lưu địa chỉ của một struct_person ở vị trí trường dữ liệu đầu tiên của một kiểu struct khác thì kiểu struct mới định nghĩa sẽ có thể được xem là một kiểu kế thừa từ class Person. Bởi giả sử nếu chúng ta đang có một con trỏ Worker kế thừa từ Person theo cách này, một hàm được định nghĩa có tham số đầu vào là Person cũng sẽ hoạt động tốt nếu chúng ta truyền vào địa chỉ của ô nhớ đầu tiên lưu trữ kiểu Worker.

#include "Person.h" typedef struct { person_struct super; char* class; int stamina;
} worker_struct; worker_struct worker (char* $name, int $age, int $stamina); typedef worker_struct* Worker; Worker new_Worker (char* $name, int $age, int $stamina);
#include "Worker.h" worker_struct worker ( char* $name, int $age, int $stamina
) { person_struct $super = person ($name, $age); worker_struct $primitive = { .super = $super, .class = "Worker", .stamina = $stamina }; return $primitive;
} Worker new_Worker ( char* $name, int $age, int $stamina
) { worker_struct $primitive = worker ($name, $age, $stamina); Worker $reference = & ($primitive); return $reference;
}
#include <stdio.h>
#include "Worker.h" void put_person (Person $person) { printf ("Class : %s \n", $person->class); printf ("Name : %s \n", $person->name); printf ("Age : %i \n", $person->age);
} void main ( int $argc, char* $argv[]
) { Worker $me = new_Worker ("Semi Dev_", 1001, 10000); put_person ((void*) $me);
}
Class : Person Name : Semi Dev_ Age : 1001

Bình luận

Bài viết tương tự

- vừa được xem lúc

4 đặc tính của lập trình hướng đối tượng (Object oriented program)

Lập trình hướng đối tượng quá quen thuộc rồi bạn nào học lập trình đều phải học, đi phỏng vấn cũng vậy hỏi suốt(chắc cái này tùy vào vị trí tuyển dụng chủ yếu junior chắc chắn sẽ hỏi).nó là nền tảng cho hầu hết các design pattern hiện nay.

0 0 34

- vừa được xem lúc

Khác nhau giữa abstract class và interface khi nào dùng chúng

Nhắc đến Interface và abstract class hãy nhớ 2 từ này khá clear rồi, Khi sử dụng Interface là bạn Implement còn sử dụng abstract class là bạn extend. . Interface:. .

0 0 29

- vừa được xem lúc

Chuyện con vịt, cái máy bay và cu Tèo đọc báo

Chuyện con vịt, cái máy bay và cu Tèo đọc báo. Người đọc tự chịu trách nhiệm về tính xác thực của bài viết.

0 0 53

- vừa được xem lúc

Kinh nghiệm làm việc với Cgo

Kinh nghiệm làm việc với Cgo. Cuối tuần vừa rồi mình có làm một project nho nhỏ để học hỏi thêm, điểm khá thú vị là project này tuy không to lắm nhưng lại chứa khá là nhiều vấn đề và buộc mình phải tì

0 0 35

- vừa được xem lúc

Cách xây dựng cấu trúc dữ liệu Stack và Queue.

Mở đầu. Hello các bạn, hôm nay mình sẽ chia sẻ với các bạn cách để có thể tự xây dựng 2 loại cấu trúc dữ liệu stack(ngăn xếp) và queue(hàng đợi) sử dụng mảng trong C++;.

0 0 31

- vừa được xem lúc

Lập trình socket, giao tiếp client và server bằng ngôn ngữ C (với giao thức TCP)

Lập trình mạng là gì. Lập trình mạng là một trong những nhiệm vụ căn bản để phát triển các ứng dụng.

0 0 150