2016-07-28 11 views
10

Ten kod faktycznie działa:Czy mieszanie starej i nowej składni funkcji C++ w klasie jest dozwolone?

class Abstract { 
    virtual auto foo() -> int = 0; 
}; 

class Concrete: public Abstract { 
    int foo() { cout << "blah!" << endl; return 1; } 
} instance; 

Rozumiem, że funkcja zostaje zniekształcone i związana być taki sam podpis funkcji, ale jest to rodzaj mieszania faktycznie prawny w C++ 14?

+4

Zakładam, że "Beton" powinien pochodzić z "Abstrakcyjnego" tam? (PS: Jeśli chcesz się upewnić, że jest to w rzeczywistości przesłonięcie funkcji podstawowej, użyj słowa kluczowego override, jeśli nie uda się skompilować, wtedy wiesz, że nie pasują.) – Borgleader

+1

Ponieważ C++ jest kompatybilny wstecz, nie powinno być problem, jeśli jest poszukiwany to kolejne pytanie (przewodnik po stylu) – deW1

+0

@ deW1 * ogólnie */* głównie * zgodność wsteczna byłaby bardziej dokładna ;-) –

Odpowiedz

7

auto foo()->int i int foo() są takie same prototyp wyrażona innymi składni, aby druga funkcja jest ominięcie pierwszego i zastępuje ją w przeciągu czasu przebiegu (jako wirtualne), jak zwykle.

prawej stronie odprowadzania składni ma normalnie inny cel, na przykład

template<class A, class B> 
auto some_combination(A a, B b) -> decltype(a+b); 

inaczej wymaga bardziej złożonej składni

od a i b nie są zdefiniowane w lewym strona prototypu.

Gdy typ powrotu jest zdefiniowany trywialnie, umieszczenie w lewo lub w prawo jest w zasadzie nieistotne.

2

Jest to zgodne z prawem, ponieważ faktycznie w pełni definiujesz swoją funkcję.
Jako minimalną, np roboczej (uwaga override):

class Abstract { 
    virtual auto foo() -> int = 0; 
}; 

class Concrete: public Abstract { 
    int foo() override { return 1; } 
} instance; 

int main() { } 

Tutaj typ zwracany nie jest wywnioskować, to wyraźnie zadeklarowane za pomocą typ zwracany spływu.
To odpowiednik:

class Abstract { 
    virtual int foo() = 0; 
}; 

Byłoby inaczej, gdyby były przy użyciu to:

class Abstract { 
    virtual auto foo() = 0; 
}; 

Oto szablon odliczenie jest zaangażowany i funkcje wirtualne nie mógł wywnioskować typ zwracany (czyli więcej lub mniejszy ciąg znaków błędu z GCC).

+0

Dlaczego miałbym potrzebować zastąpić, gdy oryginalna funkcja jest czysto wirtualna? – Philipp

+2

@Philipp Override mówi wprost czytelnikowi, jaki jest zamiar programisty. Co więcej, spowoduje to błąd kompilacji, jeśli nie ma takiej wirtualnej funkcji w klasie bazowej. Dlaczego nie? – skypjack

Powiązane problemy