Ben beklenen unique_ptr<Derived>
yerde kullanan aşağıdaki kodu yazdımunique_ptr<Base>
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;
}
ve ben bu kod derlemek değil beklediğim, çünkü benim anlayışım unique_ptr<Base>
ve unique_ptr<Derived>
ilgisiz türleri ve unique_ptr<Derived>
aslında unique_ptr<Base>
ödev işe yaramaz böylece türetilmiş değildir.
Ama biraz sihir sayesinde işe yarıyor ve nedenini ya da bunu yapmak güvenli olsa bile anlamıyorum. Birisi açıklayabilir mi lütfen?
Base
sanal yıkıcıya sahip olmadığı için UB'ye sahipsiniz .
unique_ptr
olmasaydı miras varlığında işe yaramaz olurdu