2010-10-01 16 views
8

Rozważmy:Czysta wirtualny i inline definicja

struct device{ 
    virtual void switchon() = 0 {} 
}; 

int main() 
{ 

} 

pisałem kod podobny do następującego i dała błąd:

pure-specifier on function-definition compilation terminated due to -Wfatal-errors.

Kiedy zapytałem go, pokazał mi następujący cytat z normą :

A virtual function declared in a class shall be defined, or declared pure (10.4) in that class, or both; but no diagnostic is required (3.2).

Nie mogę zrozumieć, co to oznacza i myślę, że to w jakiś sposób nie ma znaczenia.

PS: Jeśli nie jest to odpowiedni cytat, poprowadź mnie do właściwego, aby uzyskać lepszy kontrargument.

+0

Co kompilatora używasz? – user200783

+3

Zobacz http://stackoverflow.com/questions/2951273/pure-specifier-on-function-definition – czchen

+0

Witam, jest to gcc 4.1.0 – Nivhus

Odpowiedz

5

Czysta funkcja wirtualna może mieć definicję (z definicji klasy). Jest to całkowicie opcjonalne. Ale to, co staramy się robić to bzdura bo

C++ 03 [Sekcja 10.4/2] mówi:

[Note: a function declaration cannot provide both a pure-specifier and a definition —end note] [Example:

struct C { 
    virtual void f() = 0 { }; // Ill-formed 
} 

jednak jesteś wolny, aby napisać

struct device{ 
    virtual void switchon() = 0; 
}; 

void device::switchon() { } // Definition {optional} 

int main() 
{ 

} 
+0

Tak, wiem o tym. Dzięki. Ale chcę wiedzieć, czy cytat, który pokazał mi mój kolega, jest poprawny czy nie w tym kontekście. Jeśli tak nie jest, co tak naprawdę oznacza ta część oświadczenia? – Nivhus

+0

Co to znaczy, że coś jest w znaczniku [Note] [Note] w standardzie? Ogólnie moim zdaniem Uwagi są czymś, co jest opcjonalne, aby przeczytać – Nivhus

+2

@Nivhus: To znaczy "Funkcja wirtualna może być zdefiniowana w klasie, może być zadeklarowana jako czysta lub może być zadeklarowana jako czysta i może być zdefiniowana (poza definicją klasy) {opcjonalnie} '. –

-1

może mieć „czysty” wirtualnej funkcji to klasa podstawa ma nie realizacji funkcji

virtual void switchon() = 0; 

i ewentualnie zapewnić implementację których pochodzi klas musi zastąpić.

void base_class::switchon() {} 

LUB

można mieć „non-czysty” wirtualnego funkcji i zapewnić domyślny lub pusty realizację

virtual void switchon() {} 
+0

Dzięki. Chcę wiedzieć, czy cytat, który pokazał mi mój kolega, jest poprawny, czy nie w tym kontekście. – Nivhus

+1

Możesz zaimplementować czystą funkcję wirtualną (co oznacza, że ​​klasy pochodne muszą ją zastąpić, a nie, że nie ma implementacji). Czego nie możesz zrobić, to umieścić ciało w deklaracji. –

+0

@Ben Voigt za komentowanie i inni użytkownicy, którzy oddali głos: Dziękuję bardzo. Nie wiedziałem o tym, dziś nauczyłem się czegoś nowego. – Arun