ในส่วนก่อนหน้านี้ เราเห็นวิธีการนิยามของคลาสที่ได้รับมา โดยใช้การสืบทอดแบบสาธารณะ จริงๆ แล้วมีสามวิธีในที่นี้ ได้แก่ การ สืบทอด แบบสาธารณะ การสืบทอดแบบส่วนตัว และ การรับมรดกที่ได้รับการ คุ้มครอง
ความแตกต่างที่สำคัญระหว่างวิธีการสืบทอดที่แตกต่างกันนั้นอยู่ที่การเปลี่ยนแปลงสิทธิ์การเข้าถึงของสมาชิกที่มีสิทธิ์การเข้าถึงที่แตกต่างกันในคลาสพื้นฐานในคลาสที่ได้รับ แนะนำทีละอันด้านล่าง
1. มรดกสาธารณะ:
ในโหมดการสืบทอดสาธารณะมีลักษณะดังต่อไปนี้:
(1) สมาชิกสาธารณะในคลาสพื้นฐานยังคงเป็นสมาชิกสาธารณะในคลาสที่ได้รับ แน่นอนว่าทั้งฟังก์ชันสมาชิกและอ็อบเจ็กต์คลาสที่ได้รับในคลาสที่ได้รับสามารถเข้าถึงได้
(2) สมาชิกส่วนตัวในคลาสพื้นฐานไม่สามารถเข้าถึงได้โดยสมาชิกของคลาสที่ได้รับหรืออ็อบเจ็กต์ของคลาสที่ได้รับ
(3) สมาชิกที่ได้รับการป้องกันในคลาสพื้นฐานยังคงเป็นประเภทที่ได้รับการป้องกันในคลาสที่ได้รับและสามารถเข้าถึงได้ผ่านฟังก์ชันสมาชิกของคลาสที่ได้รับ แต่ไม่สามารถเข้าถึงอ็อบเจ็กต์คลาสที่ได้รับ
2. มรดกส่วนบุคคล:
ในกรณีมรดกส่วนบุคคล สิทธิการเข้าถึงของสมาชิกทั้งสามประเภท ได้แก่ ประเภทสาธารณะ ประเภทส่วนตัว และประเภทที่ได้รับการคุ้มครองมีดังนี้
(1) ประเภทสาธารณะและประเภทที่ได้รับการคุ้มครองของคลาสพื้นฐาน หลังจากที่ถูกดูดซับโดยมรดกส่วนตัวของคลาสที่ได้รับแล้ว จะกลายเป็นประเภทส่วนตัวของคลาสที่ได้รับ นั่นคือ พวกเขาสามารถเข้าถึงได้ในฟังก์ชันสมาชิกของคลาส และไม่สามารถ สามารถเข้าถึงได้นอกชั้นเรียน
(2) สมาชิกส่วนตัวของคลาสฐานไม่สามารถเข้าถึงได้ในคลาสที่ได้รับไม่ว่าจะภายในหรือภายนอกคลาส
เราจะเห็นได้ว่าหากเป็นการสืบทอดแบบไพรเวต สมาชิกไพรเวตของคลาสพื้นฐานจะไม่สามารถนำมาใช้ในคลาสที่ได้รับหรือแม้แต่คลาสย่อยที่ได้รับอีกต่อไป และไม่มีความหมาย ดังนั้น การใช้งานประเภทนี้จึงค่อนข้างหายาก
3. ปกป้องมรดก:
การสืบทอดประเภทที่ได้รับการป้องกันมีลักษณะดังต่อไปนี้:
(1) สมาชิกสาธารณะและสมาชิกประเภทที่ได้รับการคุ้มครองของคลาสพื้นฐานเป็นสมาชิกที่ได้รับการคุ้มครองในคลาสที่ได้รับ
(2) สมาชิกส่วนตัวของคลาสฐานไม่สามารถเข้าถึงได้โดยตรงในคลาสที่ได้รับ
จะเห็นได้ว่าฟังก์ชันสมาชิกในคลาสที่ได้รับสามารถเข้าถึงสมาชิกสาธารณะและสมาชิกที่ได้รับการป้องกันของคลาสฐาน แต่ไม่สามารถเข้าถึงได้ภายนอกคลาสผ่านอ็อบเจ็กต์คลาสที่ได้รับ ในทำนองเดียวกัน สมาชิกส่วนตัวในคลาสฐานไม่สามารถเข้าถึงได้ผ่านฟังก์ชันสมาชิกในคลาสที่ได้รับหรือผ่านอ็อบเจ็กต์คลาส
ต่อไปนี้ยังคงใช้โค้ดโปรแกรมของนาฬิกาและนาฬิกาปลุกเป็นตัวอย่างในการทดสอบกับปัญหาการเข้าถึงประเภทต่างๆ ที่ได้รับจากการอนุญาตที่แตกต่างกันในคลาสพื้นฐาน สำหรับประเภทสาธารณะ พวกเขาสามารถเรียกได้ในวิธีการสมาชิกของคลาสที่ได้รับหรือภายนอกคลาส การคอมไพล์จะทำงานโดยไม่มีข้อผิดพลาดดังต่อไปนี้:
แต่สำหรับสมาชิกส่วนตัวเราพยายามเพิ่มบรรทัดโค้ดดูบรรทัดที่ 41 ในฟังก์ชันสมาชิกของคลาสที่ได้รับ จะมีการกำหนดตัวแปร H ที่ดูดซับจากคลาสพื้นฐาน และมีการรายงานข้อผิดพลาดระหว่างการคอมไพล์ ดูกล่องสีแดงและข้อความแจ้งด้านล่าง:
คุณสามารถดูข้อความแสดงข้อผิดพลาด "H เป็นประเภทส่วนตัว"
สำหรับประเภทที่ได้รับการป้องกัน เราพยายามกำหนดตัวแปรประเภทที่ได้รับการป้องกันในคลาสพื้นฐาน และพยายามกำหนดและใช้ในวิธีการเรียนที่ได้รับแบบสาธารณะ คุณสามารถดูสถานการณ์ในภาพด้านล่าง ซึ่งสามารถเข้าถึงได้อย่างเต็มที่ ดังที่แสดงด้านล่าง:
สำหรับการสืบทอดส่วนตัว สมาชิกประเภทสาธารณะจะถูกเข้าถึงภายนอกคลาส:
คุณสามารถทดลองด้วยตัวเองเพื่อตรวจสอบการเข้าถึงของสมาชิกประเภทต่างๆ ภายใต้มรดกสาธารณะ
หลังจากศึกษาและทดลองแล้วสรุปได้ดังนี้
1. สมาชิกส่วนตัวของคลาสฐานไม่สามารถเข้าถึงได้โดยฟังก์ชันสมาชิกภายในคลาสที่ได้รับหรือภายนอกคลาส โดยไม่คำนึงถึงสิทธิ์ที่ได้รับ
2. การสืบทอดส่วนตัว ไม่ว่าคลาสฐานดั้งเดิมจะเป็นประเภทใดก็ตาม ก็ไม่สามารถเข้าถึงได้ผ่านฟังก์ชันสมาชิกที่อยู่นอกคลาสที่ได้รับ
3. สิทธิ์การเข้าถึงของสมาชิกที่ถูกดูดซับโดยคลาสที่ได้รับจากคลาสพื้นฐานนั้นต่ำที่สุดของสิทธิ์การเข้าถึงในคลาสพื้นฐานและสิทธิ์ที่ได้รับในขณะที่ได้รับมา
และขึ้นอยู่กับการรวมกันของสิทธิ์ที่ได้รับ สิทธิ์ที่กำหนดไว้ในคลาสพื้นฐาน และเวลาการเข้าถึงที่แตกต่างกันภายในคลาสที่ได้รับและนอกคลาส ตารางต่อไปนี้จะแสดงรายการ:
มรดกสาธารณะ | มรดกที่ได้รับการคุ้มครอง | มรดกส่วนตัว | ||||
เยี่ยมชมสถานที่ | ภายในชั้นเรียน | ออกจากชั้นเรียน | ภายในชั้นเรียน | ออกจากชั้นเรียน | ภายในชั้นเรียน | ออกจากชั้นเรียน |
สมาชิกสาธารณะ | สามารถ | สามารถ | สามารถ | ไม่สามารถ | สามารถ | ไม่สามารถ |
ปกป้องสมาชิก | สามารถ | ไม่สามารถ | สามารถ | ไม่สามารถ | สามารถ | ไม่สามารถ |
สมาชิกส่วนตัว | ไม่สามารถ | ไม่สามารถ | ไม่สามารถ | ไม่สามารถ | ไม่สามารถ | ไม่สามารถ |