예상되는 unique_ptr<Derived>
위치 를 사용하는 다음 코드를 작성했습니다.unique_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;
}
나의 이해에 따라 때문에 내가 컴파일하지에이 코드를 기대 unique_ptr<Base>
하고하는 것은 unique_ptr<Derived>
관련이없는 종류와 unique_ptr<Derived>
에서 파생 된 사실에없는 unique_ptr<Base>
할당이 작업 안 그렇게.
그러나 어떤 마술 덕분에 효과가 있으며, 왜, 또는 그렇게하는 것이 안전한지 이해하지 못합니다. 누군가 설명해 주시겠습니까?
Base
가상 소멸자가 없으므로 UB 가 있습니다.
unique_ptr
하지 않다면 상속 이 있을 때 오히려 쓸모가 없을 것입니다