ฉันเขียนรหัสต่อไปนี้ซึ่งใช้ใน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
ไม่มีตัวทำลายเสมือน
unique_ptr
จะค่อนข้างไร้ประโยชน์เมื่อมีการสืบทอด