Ich habe den folgenden Code geschrieben, der verwendet, unique_ptr<Derived>
wo a unique_ptr<Base>
erwartet wird
class Base {
int i;
public:
Base( int i ) : i(i) {}
int getI() const { return i; }
};
class Derived : public Base {
float f;
public:
Derived( int i, float f ) : Base(i), f(f) {}
float getF() const { return f; }
};
void printBase( unique_ptr<Base> base )
{
cout << "f: " << base->getI() << endl;
}
unique_ptr<Base> makeBase()
{
return make_unique<Derived>( 2, 3.0f );
}
unique_ptr<Derived> makeDerived()
{
return make_unique<Derived>( 2, 3.0f );
}
int main( int argc, char * argv [] )
{
unique_ptr<Base> base1 = makeBase();
unique_ptr<Base> base2 = makeDerived();
printBase( make_unique<Derived>( 2, 3.0f ) );
return 0;
}
und ich erwartete diesen Code nicht kompilieren, weil nach meinem Verständnis unique_ptr<Base>
und unique_ptr<Derived>
nicht verwandte Arten sind und unique_ptr<Derived>
ist nicht in der Tat , die von unique_ptr<Base>
so die Zuordnung nicht funktionieren soll.
Aber dank etwas Magie funktioniert es und ich verstehe nicht warum oder auch wenn es sicher ist. Kann mir bitte jemand erklären?
Base
es keinen virtuellen Destruktor gibt.
unique_ptr
wäre, wäre es in Gegenwart von Vererbung eher nutzlos