c ++ มรดก
การเขียนโปรแกรมเชิงวัตถุเป็นแนวคิดที่สำคัญที่สุดคือการสืบทอด มรดกช่วยให้เราสามารถกำหนดระดับที่ตามชั้นอื่นซึ่งจะทำให้การสร้างและรักษาโปรแกรมที่ง่ายขึ้น จะทำเช่นนั้นก็มาถึงนำมาใช้ใหม่ของการทำงานของรหัสและปรับปรุงผลเวลาดำเนินการ
เมื่อคุณสร้างชั้นคุณไม่จำเป็นต้องเขียนข้อมูลสมาชิกและฟังก์ชั่นสมาชิกใหม่เพียงแค่ระบุชั้นเรียนใหม่ได้รับมรดกเป็นสมาชิกที่มีอยู่ของชั้นเรียนสามารถชั้นที่มีอยู่จะเรียกว่าชั้นฐานชั้นใหม่ที่เรียกว่าชั้นเรียนมา
มรดกเป็นตัวแทนของความสัมพันธ์ยกตัวอย่างเช่นการเลี้ยงลูกด้วยนมเป็นสัตว์ที่เลี้ยงลูกด้วยนมสุนัขจึงสุนัขเป็นสัตว์และอื่น ๆ
และมาชั้นฐานชั้น
ชั้นจะได้รับจากระดับมากกว่าหนึ่งซึ่งหมายความว่ามันสามารถรับข้อมูลและฟังก์ชั่นจากฐานเรียนหลาย กำหนดชั้นมาเราใช้รายการเรียนมาเพื่อระบุชั้นฐาน รายการรากศัพท์ชั้นชั้นฐานหนึ่งหรือมากกว่าหนึ่งชื่อรูปแบบต่อไปนี้:
class derived-class: access-specifier base-class
ประเด็นการเข้าถึงปรับปรุงการเข้าถึงระบุเป็นของประชาชนได้รับการคุ้มครองหรือเอกชนฐานชั้นก่อนที่จะมีการกำหนดชื่อของชั้นเรียนหากไม่มีการปรับปรุงการเข้าถึงการเข้าถึงระบุเริ่มต้นมีความเป็นส่วนตัว
สมมติว่าคุณมีรูปร่างที่ชั้นฐานสี่เหลี่ยมคลาสที่ได้รับของดังต่อไปนี้:
#include <iostream> using namespace std; // 基类 class Shape { public: void setWidth(int w) { width = w; } void setHeight(int h) { height = h; } protected: int width; int height; }; // 派生类 class Rectangle: public Shape { public: int getArea() { return (width * height); } }; int main(void) { Rectangle Rect; Rect.setWidth(5); Rect.setHeight(7); // 输出对象的面积 cout << "Total area: " << Rect.getArea() << endl; return 0; }
เมื่อโค้ดข้างต้นจะรวบรวมและดำเนินการก็จะก่อให้เกิดผลลัพธ์ต่อไปนี้:
Total area: 35
ควบคุมการเข้าถึงและการถ่ายทอดทางพันธุกรรม
ชั้นเรียนมาสามารถเข้าถึงชั้นฐานสำหรับสมาชิกที่ไม่ใช่เอกชนทั้งหมด ดังนั้นถ้าคุณต้องการที่จะเป็นสมาชิกคนหนึ่งของฟังก์ชันสมาชิกระดับฐานของการเข้าถึงชั้นเรียนมาควรจะประกาศในฐานชั้นที่มีความเป็นส่วนตัว
เราสามารถสรุปสิทธิการเข้าถึงที่แตกต่างกันตามชนิดของการเข้าถึงดังต่อไปนี้:
访问 | public | protected | private |
---|---|---|---|
同一个类 | yes | yes | yes |
派生类 | yes | yes | no |
外部的类 | yes | no | no |
คลาสที่ได้รับสืบทอดมาทุกวิธีการเรียนฐานยกเว้นในกรณีต่อไปนี้:
- คอนสตรัคชั้นฐานและ destructor และคัดลอกคอนสตรัค
- ผู้ประกอบการมากเกินไปชั้นฐานของ
- เพื่อนคนหนึ่งของฟังก์ชั่นชั้นฐาน
ประเภทของการรับมรดก
เมื่อชั้นได้มาจากชั้นฐานชั้นฐานสามารถสืบทอดเป็นสาธารณะคุ้มครองหรือประเภทส่วนตัวผ่านคำอธิบายข้างต้นคือการสืบทอดชนิดของการเข้าถึงปรับปรุงการเข้าถึงระบุเพื่อระบุ
เราแทบจะไม่ได้ใช้หรือได้รับการคุ้มครองมรดกส่วนตัวมักจะใช้มรดกสาธารณะเมื่อความแตกต่างของมรดกปฏิบัติตามกฎต่อไปนี้:
- ระดับสมาชิกได้รับการคุ้มครองเมื่อมีระดับมาจากชั้นฐานสาธารณะสมาชิกของประชาชนระดับฐานที่ได้มาเป็นสมาชิกของประชาชนระดับสมาชิกป้องกันชั้นฐานเป็นชั้นที่ได้มาจากสมาชิกของเอกชนชั้นฐานไม่สามารถได้รับโดยตรง:มรดกสาธารณะ (สาธารณะ) การเข้าถึงแต่สามารถเข้าถึงได้โดยการเรียกสมาชิกของประชาชนและการป้องกันจากระดับฐาน
- มรดกที่มีการป้องกัน (ป้องกัน): เมื่อชั้นที่ได้มาจากการป้องกันชั้นฐานสมาชิกของประชาชนและการป้องกันของชั้นฐานจะกลายเป็นสมาชิกในการป้องกันจากชั้นเรียนมา
- มรดกเอกชน (ส่วนตัว): เมื่อชั้นได้มาจากชั้นฐานสมาชิกเอกชนประชาชนและการป้องกันของชั้นฐานจะต้องเป็นสมาชิกของเอกชนชั้นเรียนมา
มรดกหลาย
มรดกหลายที่เป็นคลาสย่อยสามารถมีระดับผู้ปกครองมากกว่าหนึ่งที่สืบทอดลักษณะของระดับผู้ปกครองมากกว่าหนึ่ง
คลาส c ++ สามารถสืบทอดจากคลาสมากกว่าหนึ่งสมาชิกไวยากรณ์ต่อไปนี้:
class <派生类名>:<继承方式1><基类名1>,<继承方式2><基类名2>,… { <派生类类体> };
ขัดแย้งมรดกเข้าถึงปรับปรุงเป็นสาธารณะคุ้มครองหรือเอกชนหนึ่งที่ใช้ในการตกแต่งแต่ละชั้นฐานชั้นฐานระหว่างแต่ละคั่นด้วยเครื่องหมายจุลภาคดังที่แสดงไว้ข้างต้นตอนนี้ให้เราดูตัวอย่างต่อไปนี้:
#include <iostream> using namespace std; // 基类 Shape class Shape { public: void setWidth(int w) { width = w; } void setHeight(int h) { height = h; } protected: int width; int height; }; // 基类 PaintCost class PaintCost { public: int getCost(int area) { return area * 70; } }; // 派生类 class Rectangle: public Shape, public PaintCost { public: int getArea() { return (width * height); } }; int main(void) { Rectangle Rect; int area; Rect.setWidth(5); Rect.setHeight(7); area = Rect.getArea(); // 输出对象的面积 cout << "Total area: " << Rect.getArea() << endl; // 输出总花费 cout << "Total paint cost: $" << Rect.getCost(area) << endl; return 0; }
เมื่อโค้ดข้างต้นจะรวบรวมและดำเนินการก็จะก่อให้เกิดผลลัพธ์ต่อไปนี้:
Total area: 35 Total paint cost: $2450