2 Ekim 2019 Çarşamba

std::unique_ptr ve Kalıtım

Giriş
Kalıtım varsa bile unique_ptr sorunsuz çalışır.
std::unique_ptr<Derived> is implicitly convertible to std::unique_ptr<Base> through the overload (6)
Bunun sebebi özel bir constructor'a sahip olması. İmzası şöyle
template<class U, class E>
unique_ptr(unique_ptr<U, E> &&u) noexcept;
Örnek
Aşağıda bir factory metodununz Cat, Dog, Animal  kalıtım hiyerarşini kullanan nesneler
döndürdüğü görülebilir.
std::unique_ptr<Animal> factory(const int i)
{
  if (i == 1)
    return std::unique_ptr<Cat>(new Cat());
  else if (i == 2)
    return std::unique_ptr<Dog>(new Dog());
  else
    return std::unique_ptr<Animal>(new Animal());
}
Örnek
Şöyle yaparız. printBase() metoduna std::unique_ptr<Derived> geçilebilir.
class Base {
  ...
};

class Derived : public Base {
  ...
};

void printBase( unique_ptr<Base> base )
{
    cout << "f: " << base->getI() << endl;
}


int main( int argc, char * argv [] )
{
  printBase( make_unique<Derived>( 2, 3.0f ) );

  return 0;
}
Örnek
Kalıtım için public inheritance gerekir. Eğer public inheritance yoksa kod derlenmez. Şu kod derlenmez.
class Base {};
class Derived : Base {};

unique_ptr<Base> Create() {
    unique_ptr<Base> basePtr = make_unique<Derived>(); // compile error
    return basePtr;
}
Derlenmesi için şöyle yaparız.
class Base {};
 class Derived : public Base {};
                 ^^^^^^

Hiç yorum yok:

Yorum Gönder