2012-05-10 8 views
9

Czy zmiana kolejności publicznych nie-wirtualnych nieliniowych przeciążonych metod w klasie autonomicznej powoduje złamanie ABI?Czy zmienia kolejność publicznych metod innych niż wirtualne w samodzielnym zerwaniu klasy ABI?

Przed:

class MyFinalClass 
{ 
public: 
    // ... 
    void doSomething(char c, int i, int n); 
    void doSomething(char c, int i); 
    // ... 
}; 

Po:

class MyFinalClass 
{ 
public: 
    // ... 
    void doSomething(char c, int i); 
    void doSomething(char c, int i, int n); 
    // ... 
}; 

Dzięki!

+1

Teoretycznie odpowiedź zależy od tego, z której platformy/biblioteki narzędziowej korzystasz - C++ nie określa żadnego konkretnego ABI. – Flexo

+4

Dla takich jak ja, którzy nie wiedzieli, co oznacza ABI: http://en.wikipedia.org/wiki/Application_binary_interface Teraz robisz! – Stormenet

Odpowiedz

8

Funkcje są powiązane przez ich nazwę i podpis, a nie przez ich pozycję w klasie. Więc nie, nie łamiesz ABI.

Funkcje wirtualne to zupełnie inna sprawa, ponieważ są połączone przez ich położenie w vtable (zwykle). Nie będzie to problemem, jeśli konsekwentnie przekompilujesz każdy plik, który zależy od nagłówka, który definiuje zamówienie, ale jeśli klasa istnieje w bibliotece, może to być problemem.

+0

Przynajmniej: nie jest problemem w Itanium ABI :) –

+0

Nie byłem pewien. Dzięki! –

1

Są dwie rzeczy, które łamią ABI po aktualizacji zajęć. Wirtualne funkcje wskazane przez Mark (i pamiętaj, że to nie dlatego, że nie zaznaczyłeś funkcji jako wirtualnej, która nie jest).

Inną rzeczą są wbudowane funkcje, ponieważ wykorzystują one zmienne elementy. Jeśli kolejność zmiennych członków ulegnie zmianie, ulegną również inline, które zostały skompilowane w innym oprogramowaniu.

+2

Ponieważ pytanie nie wspomniało o zmianie zmiennych członków, nie brałem pod uwagę tego w mojej odpowiedzi, bardzo dobry punkt! Nie muszą nawet być publicznie. Doceniam również twoje przypomnienie, że klasa podstawowa może uczynić funkcję wirtualną, nawet jeśli nie jest tak zadeklarowana w klasie pochodnej. –