สมมติว่าการควบคุมการเข้าถึงมาก่อนความละเอียดเกินพิกัด อย่างมีประสิทธิภาพนี่จะหมายถึง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) จะเกิดขึ้นก่อนการควบคุมการเข้าถึงด้วย ความคลุมเครือสามารถแก้ไขได้โดยการกำหนดชื่อด้วยชื่อคลาส