Saya menulis kode berikut yang menggunakan unique_ptr<Derived>
tempat yang unique_ptr<Base>
diharapkan
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;
}
dan saya berharap kode ini tidak dapat dikompilasi, karena menurut pemahaman saya unique_ptr<Base>
dan unique_ptr<Derived>
tidak terkait jenis dan unique_ptr<Derived>
sebenarnya bukan berasal dari unique_ptr<Base>
sehingga tugas tidak seharusnya bekerja.
Tetapi berkat beberapa sihir itu berhasil, dan saya tidak mengerti mengapa, atau bahkan jika itu aman untuk melakukannya. Bisakah seseorang menjelaskannya?
Base
tidak memiliki destruktor virtual.
unique_ptr
akan menjadi agak tidak berguna di hadapan warisan