สมมติว่าการควบคุมการเข้าถึงมาก่อนความละเอียดเกินพิกัด อย่างมีประสิทธิภาพนี่จะหมายถึงpublic/protected/private
การมองเห็นที่ควบคุมได้มากกว่าการเข้าถึง
ส่วนที่ 2.10 ของการออกแบบและวิวัฒนาการของ C ++ โดย Stroustrupมีเนื้อหาเกี่ยวกับเรื่องนี้ซึ่งเขากล่าวถึงตัวอย่างต่อไปนี้
int a; // global a
class X {
private:
int a; // member X::a
};
class XX : public X {
void f() { a = 1; } // which a?
};
Stroustrup กล่าวว่าประโยชน์ของกฎปัจจุบัน (การมองเห็นก่อนการเข้าถึง) คือ (ชั่วคราว) การเปลี่ยนprivate
ภายในclass X
เป็นpublic
(เช่นเพื่อวัตถุประสงค์ในการดีบัก) คือไม่มีการเปลี่ยนแปลงอย่างเงียบ ๆ ในความหมายของโปรแกรมข้างต้น (เช่นX::a
คือพยายามที่จะ เข้าถึงได้ในทั้งสองกรณีซึ่งทำให้เกิดข้อผิดพลาดในการเข้าถึงในตัวอย่างด้านบน) หากpublic/protected/private
จะควบคุมการมองเห็นความหมายของโปรแกรมจะเปลี่ยนไป (global a
จะเรียกด้วยprivate
มิฉะนั้นX::a
)
จากนั้นเขาก็บอกว่าเขาจำไม่ได้ว่ามันเกิดจากการออกแบบที่ชัดเจนหรือผลข้างเคียงของเทคโนโลยีพรีโปรเซสเซอร์ที่ใช้ในการนำ C ที่มี Classess รุ่นก่อนไปใช้กับ Standard C ++
สิ่งนี้เกี่ยวข้องกับตัวอย่างของคุณอย่างไร? โดยทั่วไปเนื่องจาก Standard ทำให้ความละเอียดเกินพิกัดเป็นไปตามกฎทั่วไปที่การค้นหาชื่อมาก่อนการควบคุมการเข้าถึง
10.2 การค้นหาชื่อสมาชิก [class.member.lookup]
1 การค้นหาชื่อสมาชิกกำหนดความหมายของชื่อ (id-expression) ในขอบเขตคลาส (3.3.7) การค้นหาชื่ออาจทำให้เกิดความคลุมเครือซึ่งในกรณีนี้โปรแกรมมีรูปแบบไม่ถูกต้อง สำหรับนิพจน์ id การค้นหาชื่อจะเริ่มต้นในขอบเขตคลาสของสิ่งนี้ สำหรับ ID ที่ผ่านการรับรองการค้นหาชื่อจะเริ่มต้นในขอบเขตของตัวระบุชื่อที่ซ้อนกัน การค้นหาชื่อจะเกิดขึ้นก่อนการควบคุมการเข้าถึง (3.4, ข้อ 11)
8 หากพบชื่อของฟังก์ชันที่โอเวอร์โหลดอย่างไม่น่าสงสัย
ความละเอียดเกินพิกัด (13.3) จะเกิดขึ้นก่อนการควบคุมการเข้าถึงด้วย ความคลุมเครือสามารถแก้ไขได้โดยการกำหนดชื่อด้วยชื่อคลาส