6

Wiem, że domyślny konstruktor nie jest dziedziczony, jak podano w n3337.Potrzebujemy przykładu pokazującego, że domyślny konstruktor nie jest dziedziczony

I jest przykładem tam:

struct B2 { 
    B2(int = 13, int = 42); 
}; 

struct D2 : B2 { 
    using B2::B2; 
}; 

z dość dobre wyjaśnienie:

Zestaw kandydat dziedzicznych konstruktorów w D2 dla B2 jest

... 
—B2(int = 13, int = 42) 
—B2(int = 13) 
—B2() 

I najważniejsze:

Zestaw konstruktorów obecnych w D2 jest
—D2(), niejawnie zadeklarowanej konstruktor domyślny, nie odziedziczył

Dla mnie ten przykład nie widać różnicy, w pewnym sensie, że nawet jeśli to bardzo Konstruktor był dziedziczony - jego zachowanie nie różniło się od domyślnie zadeklarowanego konstruktora domyślnego.

Potrzebuję przykładu pokazującego różnicę w sposobie łatwego zrozumienia, powiedzmy, publiczności zaznajomionej z C++ 03, ale pragnącej poznać C++ 11.


[UPDATE]
Wszystkie odpowiedzi (w tym moje własne) są typu "jeśli domyślna c-tor został odziedziczony po czym przykładem może skompilować/nie skompilować".

Wolałbym odpowiedzi, w których wynik (obserwowalne zachowanie) jest inny niż byłoby inaczej.

Odpowiedz

2

Rozważmy:

struct foo 
{ 
    foo() {} 
    foo(int) {} 
}; 

struct bar : foo 
{ 
    using foo::foo; 
}; 

int main() 
{ 
    bar b; 
} 

kompiluje to: Ponieważ bar ma użytkownika oświadczył konstruktorów, domyślny konstruktor zostanie ogłoszony w sposób dorozumiany.

struct foo 
{ 
    foo() {} 
    foo(int) {} 
}; 

struct bar : foo 
{ 
    using foo::foo; 
    bar(double) {} 
}; 

int main() 
{ 
    bar b; 
} 

To nie jest kompilacja. Domyślny konstruktor nie jest dziedziczony i nie jest deklarowany niejawnie, ponieważ istnieje konstruktor bar(double).

+0

patrząc na propozycje (np [N2203] (http://www.open-std.org/JTC1/SC22/WG21/docs/papers /2007/n2203.html)), wydaje się, że było to (część?) Uzasadnienie, aby nie dziedziczyć kopiowania/przenoszenia i domyślnych ctors. – dyp

3

Jedna z możliwych różnic: dziedziczenie wielu konstruktorów z klas z domyślnymi konstruktorami. Na przykład:

struct A { A(int=0); }; 
struct B { B(double=3.14); }; 
struct C : A, B { 
    using A::A; 
    using B::B; 
}; 

C c; 

Jeśli domyślne konstruktorów były dziedziczone, C odziedziczy po jednym z obu A i B, w wyniku niejednoznaczności.

Nie mogę wymyślić przypadku użycia dla dziedziczenia wielu konstruktorów, więc może to nie być idealny przykład, którego szukasz, ale jest to coś.

1

Oto przykład, który może być wytwarzany z następującej cechy dziedziczne konstruktorów:

12,9 Dziedziczenie konstruktorów
[...]
4) Konstruktor tak zadeklarowanym w takim samym zakresie co odpowiedni konstruktor w X.

Więc moja propozycja jest już chroniony konstruktor domyślny w bazie:

class Base { 
protected: 
    Base(int) {} 
    Base() = default; 
}; 

Jeśli ten konstruktor został wyprowadzony, wówczas klasa pochodna nie może być utworzona w instancji, ponieważ konstruktor pochodny miałby dostęp chroniony. Jeśli nie pochodzi - wtedy domyślnie niejawnie zadeklarowana konstruktor ma publicznego dostępu:

struct Derived : Base { 
    using Base::Base; 
}; 

int main() { 
    Derived d1{}; // not inherited, default constructor is public 
    Derived d2{1}; // not compiling since this c-tor is inherited, thus protected 
}