2012-05-23 24 views
6

Rzućmy klasę tak:Jak uniknąć konstruktorów kodów?

struct Base { 
    Base() { ... } 
    Base(int) { ... } 
    Base(int,string) { ... } 
    ... 
}; 

chciałbym odziedziczyć wiele klas od Base, więc piszę

struct Son : public Base { 
    Son() : Base() { } 
    Son(int) : Base(int) { } 
    Son(int,string) : Base(int,string) { } 
}; 

struct Daughter : public Base { 
    Daughter() : Base() { } 
    Daughter(int) : Base(int) { } 
    Daughter(int,string) : Base(int,string) { } 
}; 

i nie trzeba dodawać żadnego kodu do konstruktorów dziecka. Czy można odziedziczyć je pośrednio? Aby wywołać je tak samo, jak w przypadku Base, wystarczy zmienić nazwę? Preprocessor może być tutaj nadużywany, ale czy istnieje inny sposób obejścia tego problemu?

+1

C++ 11 ma delegujące konstruktory. – 111111

+0

Dzika sugestia: czy mógłbyś rozważyć dodanie kilku (starannie wybranych) domyślnych argumentów? 'Daughter (int i = 0, string s =" Hello "): Baza (i, s)' byłaby pojedynczym konstruktorem. –

+0

@ 111111: Świetnie! Czy możesz podać mi link lub przykład? –

Odpowiedz

7

W zgodnej kompilatora C++ 11 (§12.9 w normie), rzeczywiście można to zrobić dość łatwo:

struct Son : public Base { 
    using Base::Base; 
}; 

to dziedziczy wszystkie konstruktorów z Base i equivalente do kodu dla klasy Son .

Niestety, wygląda na to, że najpopularniejsze kompilatory (takie jak GCC lub VC++) nie obsługują jeszcze tej funkcji, więc na razie nie masz szczęścia. Ale spróbuj tego kodu w swoim kompilatorze i zobacz, co się stanie.

+0

Czy istnieje kompilator, który już to zaimplementował? –

+0

Najnowsze wersje co najmniej VStudio i GCC implementują wiele funkcji C++ 11. To wygląda na łatwe do wdrożenia, więc założę się, że tak, ale tak naprawdę nie wiem na pewno. – Gorpik

+0

Wygląda na to, że '(GCC) 4.7.0 20111203 (eksperymentalnie)' nie jest – Vikas