Tôi đã viết đoạn mã sau sử dụng unique_ptr<Derived>
nơi unique_ptr<Base>
dự kiến
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;
}
và tôi dự kiến mã này sẽ không biên dịch, bởi vì theo sự hiểu biết của tôi unique_ptr<Base>
và unique_ptr<Derived>
là các loại không liên quan và unique_ptr<Derived>
thực tế không có nguồn gốc từunique_ptr<Base>
đó nên việc chuyển nhượng không nên hoạt động.
Nhưng nhờ một số phép thuật mà nó hoạt động, và tôi không hiểu tại sao, hoặc thậm chí nếu nó an toàn để làm như vậy. Ai đó có thể giải thích?
Base
không có hàm hủy ảo.
unique_ptr
thì sẽ khá vô dụng khi có sự kế thừa