ความเข้ากันไม่ได้ของไบนารีการเข้าถึงสมาชิกหรือแย่กว่านั้นคือเรียกฟังก์ชันของคลาสที่ไม่ถูกต้อง:
#pragma once
//include1.h:
#ifndef classw
#define classw
class class_w
{
public: int a, b;
};
#endif
ฟังก์ชั่นใช้มันและมันก็โอเค:
//functions.cpp
#include <include1.h>
void smartFunction(class_w& x){x.b = 2;}
นำมาในชั้นเรียนอื่น:
#pragma once
//include2.h:
#ifndef classw
#define classw
class class_w
{
public: int a;
};
#endif
การใช้ฟังก์ชั่นในหลักความหมายที่สองเปลี่ยนนิยามคลาส มันนำไปสู่การเข้ากันไม่ได้ของไบนารีและเพียงเกิดปัญหาเมื่อรันไทม์ และแก้ไขปัญหาโดยลบการรวมแรกใน main.cpp:
//main.cpp
#include <include2.h> //<-- Remove this to fix the crash
#include <include1.h>
void smartFunction(class_w& x);
int main()
{
class_w w;
smartFunction(w);
return 0;
}
ไม่มีตัวแปรสร้างข้อผิดพลาดในการรวบรวมหรือลิงค์เวลา
ในทางกลับกันสถานการณ์เพิ่มการรวมการแก้ไขความผิดพลาด:
//main.cpp
//#include <include1.h> //<-- Add this include to fix the crash
#include <include2.h>
...
สถานการณ์เหล่านี้ยิ่งยากขึ้นเมื่อแก้ไขข้อบกพร่องในโปรแกรมรุ่นเก่าหรือใช้ไลบรารี่ / dll / วัตถุที่แชร์ภายนอก นั่นเป็นเหตุผลที่บางครั้งต้องปฏิบัติตามกฎของความเข้ากันได้แบบไบนารีย้อนหลัง