Dědičnost. Runtime polymorfizmus. Slicing.
Knihovna
každý titul může být:
vypsat všechny informace o všech titulech autora
kolik je v knihovně knih od daného autora
nedělat konzolové rozhraní, stačí naplnit data v kódu a provést akci
virtual
class Base{ int dataBase; public: Base(int data):dataBase(data){} virtual void method(){ cout << dataBase << endl; } }; class Derived : public Base { string dataDerived; public: Derived(int dataBase, string dataDerived): Base(dataBase), dataDerived(dataDerived){ } void method() override{ Base::method(); cout << dataDerived << endl; } }; Derived d(1, "x"); d.method();
Volání metody odvozené třídy přes ukazatel na předka
#include<memory> class Base{ virtual void method() = 0; ... }; class Derived : public Base{ void method() override { ... } }; unique_ptr<Base> b = make_unique<Derived>(); b->method();
Base b; Derived d;
vector<Base> vec_base;
vector<Base> vec_base; vec_base.push_back(Derived()); Base b = Derived();
class Base{ Base(const Base&) = delete; Base& operator=(const Base&) = delete; public: Base(){} ... };
interface
, žádné abstract
=0
(čistě virtuální)class Base{ virtual void method() = 0; ... }; class Derived : public Base{ void method() override { ... } };
vector<unique_ptr<Base> > vec_ptr_base;
Z unique_ptr
nelze tvořit kopii:
void m(unique_ptr<Base> p){ unique_ptr<Base> p2 = p; } void m(unique_ptr<Base> p){ unique_ptr<Base> p2 = make_unique<Base>(p); }
class Base{ public: virtual unique_ptr<Base> clone() const = 0; }; class Derived : public Base{ public: unique_ptr<Base> clone() const override{ return make_unique<Book>(*this); } }; void m(unique_ptr<Base> p){ unique_ptr<Base> p2 = p->clone(); }
unique_ptr<Base>
automaticky odalokuje objekt.Derived
.class Base{ virtual ~Base(){} }; class Derived : public Base{ }; unique_ptr<Base> p = make_unique<Derived>();
Jak zjistit, zda je objekt daného typu?
Base* b = ... Derived* d = dynamic_cast<Derived*>(b); if(d){ ... }
Při použití na reference nelze vrátit nullptr
:
Base& b = ... Derived& d = dynamic_cast<Derived&>(b);