Jednou z nevýhod interface v C++ mohou být problémy s binární kompatibilitou. Už jenom přidání členské proměnné může být problém, a přidání virtuální metody může být nemožné - zvláště pak pokud zákazník nechce ani slyšet o tom, že by se všechny dll soubory měly přepsat, protože s tím má špatnou zkušenost, třeba proto že měl staré verze dll knihoven a s novými se mu dostanou i změny které nechtěl.
Ale dokonce i při absenci těchto problémů nabízí C++ veselé problémy. Třeba při vícenásobné dědičnosti pokud se někdo v potomku pokusí předefinovat metodu která nebyla přiděděna v base line (tudíž první děděná třída ve vícenásobné dědičnost, ta nejvíce vlevo) tak tím změní tabulku virtuálních metod potomka. Pokud něco z něj dědí, tak je třeba to všechno překompilovat, což mohou být desítky až stovky dll knihoven. Tohle se málo ví, že při použití vícenásobné dědičnosti je nejlepší všechny zděděné metody předefinovat aby byly v base-line a šly v potomku předefinovat.
AAA.DLL:
class IFace1{
virtual void method0() { }
virtual void method1() = 0;
};
class IFace2{
virtual void method2() = 0;
virtual void method3() {
}
};
class CBaseObject : public IFace1, public IFace 2 {
void method1() {}
void method2() {}
};
BBB.DLL
class MyReusableComponent : public CBaseObject {
// předefinovat method0 je ok, protože je v base-line hierarchie dědičnosti
virtual void method0() {
///....
}
// předefinování method3 po té co bylo zkompilováno AAA.DLL, BBB.DLL a CCC.DLL
// poruší tabulku virtuálních metod v CCC.DLL objektu MyObject, i když method3
// už byla definována v předkovi CBaseObject...
// souborů jako CCC.DLL je několik set a proces vyžaduje otestování celé oblasti
// závislé na daném DLL, tudíž retestování celé aplikace, a na takový testing nejsou prostředky...
//
// moudrý ten, kdo neopoměl přidat dummy metodu do base line... málokdo to zná
void method3 () { CBaseObject::method3(); }
};
CCC.DLL
class MyObject : public MyReusableComponent {
// ....
};