considerare questo pezzo di codice:costruttore di copia delle classi multiply-ereditate
#include <vector>
#include <iostream>
using namespace std;
class Base
{
char _type;
public:
Base(char type):
_type(type)
{}
~Base() {
cout << "Base destructor: " << _type << endl;
}
};
class uncopyable
{
protected:
uncopyable() {}
~uncopyable() {}
private:
uncopyable(const uncopyable&);
const uncopyable& operator=(const uncopyable&);
};
class Child : public Base, private uncopyable
{
int j;
public:
Child():
Base('c')
{}
~Child() {
cout << "Child destructor" << endl;
}
};
int main()
{
vector<Base> v;
Base b('b');
Child c;
v.push_back(b);
v.push_back(c);
return 0;
}
L'uscita sul mio sistema è:
Base destructor: b
Child destructor
Base destructor: c
Base destructor: b
Base destructor: b
Base destructor: c
Le mie domande sono:
Perché è il distruttore di
Base
(con tipo b) chiamato tre volte anziché due (abbiamo più di due copie dell'oggetto b)?Cosa succede quando si copia un oggetto di tipo
Child
, considerando che il costruttore di copia di uno dei suoi genitori è privato. È un comportamento indefinito?Mi aspettavo di ottenere un errore in fase di compilazione ogni volta che provo a copiare un oggetto di tipo
Child
. Pensavo che il costruttore di copia predefinito del figlio avrebbe provato a chiamare il costruttore di copie privato della classe Uncopyable e causare errori di compilazione. Perché non fornisce errori di compilazione?
Il motivo per cui il codice è stato progettato in questo modo è perché la classe Child
è enorme.
Il comportamento desiderato sta lanciando i dati figlio ogni volta che un client tenta di copiare un oggetto Child
(chiamando il distruttore di Child
senza chiamare il distruttore di Base
).
Questo pezzo di codice lo raggiunge, ma suppongo che si traduca in un comportamento indefinito e abbia una perdita di memoria (non chiama mai il distruttore di Child
per l'istanza copiata).
Vuoi un errore 'compile-time' o vuoi buttare via i dati di Child? Queste sono affermazioni contrastanti, a meno che mi manchi qualcosa. – Chip
@Chip Risolto il problema. Grazie. –