2013-05-16 15 views
7

Jest to kod:Brace inicjalizacji dla klasy z wirtualnym funkcji

struct A { 
    int x; 
    void f() {} 
}; 

struct B { 
    int y; 
    virtual void f() {} 
}; 

A a = {2}; 

//B b = {3}; error: no matching constructor for initialization of 'B' 

int main() { 
    return 0; 
} 

Dlaczego inicjalizacji dla zmiennych a robót, ale nie dla zmiennej b?

+1

Inicjalizacja brace działa tylko dla typów POD; sprawienie, że twoja metoda będzie wirtualna sprawia, że ​​nie jest to POD – antlersoft

+2

[Co to są Aggregates and Pods i jak/dlaczego są one specjalne] (http://stackoverflow.com/questions/4178175/what-are-aggregates-and-pods-andhow -Why-are-is-one-special) –

Odpowiedz

10

A jest agregatem, a więc może mieć inicjowanie nawiasów klamrowych, a B nie jest, ponieważ ma metodę wirtualną.

8.5.1 kruszywa

Agregat jest tablicą lub klasy (Rozdział 9) bez konstruktorów dostarczane przez użytkowników (12,1), albo bez usztywniających-same wymiary inicjalizatory non statyczne elementy danych (9.2), brak prywatnych lub chronionych niestatycznych elementów danych (klauzula 11), brak klas bazowych (klauzula 10) i brak funkcji wirtualnych (10.3).

+1

Odpowiedź jest właściwa, ale nie ma potrzeby, aby kwalifikować się do standardu '11, ponieważ odpowiedź jest dokładnie taka sama w C++ 98, C++ 03 i C++ 11 –

+0

@ DavidRodríguez-dribeas Jeszcze raz dziękuję. Nie byłem pewien, czy było to sformułowane pod względem agregacji lub POD w C++ 03. – juanchopanza

+0

Nie możesz jednak napisać konstruktora inicjatora nawiasów klamrowych? biorąc listę inicjalizatora jako argument? –

Powiązane problemy