मैंने निम्नलिखित कोड लिखा है जो कि 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
होता तो विरासत की मौजूदगी में बेकार हो जाता