オブジェクトの階層を超える関数呼び出しは、中間層のオブジェクトにラッパ関数を追加することで結合を解く。

//HigherLayer.h
class MiddleLayer;
class UpperLayer {
private:
    MiddleLayer* m_pMiddle;
public:
    HigherLayer(MiddleLayer* pMiddle) : m_pMiddle(pMiddle) {};
    void operation(void);
};

//HigherLayer.cpp
#include "MiddleLayer.h"
#include "LowerLayer.h"      //インクルードが必要
void HigherLayer::operation(void) 
{ 
    m_pMiddle->getLower()->call();        // Lowerの関数呼び出す
}
//MiddleLayer.h
class LowerLayer;
class MiddleLayer {
private:
    LowerLayer* m_pLower;
public:
    MiddleLayer(LowerLayer* pLower) : m_pLower(pLower) {};
    LowerLayer* getLower(void);
};

//MiddleLayer.cpp
#include "LowerLayer.h"
LowerLayer* MiddleLayer::getLower(void) { return m_pLower; };
//LowerLayer.h
class LowerLayer {
public:
    void call(void);
};

これを

//HigherLayer.h
class HigherLayer{
private:
    MiddleLayer* m_pMiddle;
public:
    HigherLayer(MiddleLayer* pMiddle) : m_pMiddle(pMiddle) {};
    void operation(void) { m_pMiddle->call(); };      
};

//HigherLayer.cpp
#include "MiddleLayer.h"
/* #include "LowerLayer.h" インクルード不要 */ 
void HigherLayer::operation(void) { m_pMiddle->call(); };    
//MiddleLayer.h
class LowerLayer;
class MiddleLayer {
private:
    LowerLayer* m_pLower;
public:
    MiddleLayer(LowerLayer* pLower) : m_pLower(pLower) {};
    void call(void);
};

//MiddleLayer.cpp
#include "LowerLayer.h"
void MiddleLayer::call(void) { m_pLower->call(); };
//LowerLayer.h
class LowerLayer {
public:
    void call(void);
};

こうする。