C++ Primer (5a edizione) a pagina 629 stati:Ereditando i costruttori w/wo i loro argomenti predefiniti?
- Se un costruttore della classe base ha argomenti di default, tali argomenti non vengono ereditati.
Ho provato questo per me stesso e per me sembra che il costruttore derivato generato dal compilatore ha anche gli stessi argomenti di default del costruttore base.
Ecco un piccolo test:
#include <iostream>
struct Base
{
Base() = default;
Base(int x_, int y_ = 88, int z_ = 99)
: x(x_), y(y_), z(z_) {}
virtual void debug() const
{ std::cout << "\nx - " << x << ", y - " << y << ", z - " << z << '\n'; }
private:
int x, y, z;
};
struct Derived : Base
{
using Base::Base;
};
int main() {
Base B(1);
B.debug(); // x - 1, y - 88, z - 99
Derived D(5);
D.debug(); // x - 5, y - 88, z - 99
return 0;
}
(È possibile eseguire questo qui - http://coliru.stacked-crooked.com/a/26cbb85757c1f021)
Quindi stiamo ereditando anche gli argomenti di default per un costruttore ereditaria o no?
In caso contrario, come mai non sto diventando spazzatura per gli ultimi 2 membri ma gli stessi valori esatti degli argomenti predefiniti per il costruttore ereditato dalla base?
Anche cercato su Internet per una risposta chiara su questo, ma trovato nessuno.
Ok, ma perché se "Derived (5) chiama semplicemente Base (5), non Base (5, 88, 99)." quando stampo i membri di D ottengo 5, 88, 99? Gli ultimi 2 membri non dovrebbero essere lasciati non inizializzati? – Mugurel
@Mugurel Perché 'Base (5)' chiama 'Base (int x_, int y_ = 88, int z_ = 99)'. 'Derivato' non ha argomenti predefiniti, ma' Base' lo fa ancora. – Barry
"Il risultato finale è lo stesso - il modo in cui arriviamo è un po 'diverso." Pffff :-)))) Grazie! – Mugurel