Giriş
Kalıtım varsa bile unique_ptr sorunsuz çalışır.
Aşağıda bir factory metodununz Cat, Dog, Animal kalıtım hiyerarşini kullanan nesneler
döndürdüğü görülebilir.
Kalıtım varsa bile unique_ptr sorunsuz çalışır.
Bunun sebebi özel bir constructor'a sahip olması. İmzası şöylestd::unique_ptr<Derived> is implicitly convertible to std::unique_ptr<Base> through the overload (6)
template<class U, class E>
unique_ptr(unique_ptr<U, E> &&u) noexcept;
ÖrnekAş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.
Kalıtım için public inheritance gerekir. Eğer public inheritance yoksa kod derlenmez. Şu kod derlenmez.
Şö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;
}
ÖrnekKalı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