Предположим, следующие классы
class Base
{
void Doajob(a,b){...}
}
class Derived: public Base
{
void Doanotherjob(a,b,c){...}
}
Я определил указатель следующим образом:
auto ptr= unique_ptr<Base>(new Derived(name));
Теперь я хочу получить доступ к Doanotherjob с помощью указателя ptr:
ptr->Doanotherjob(a,b,c); // ERROR
((unique_ptr<Base>) ptr)->Doanotherjob(a,b,c); // ERROR
((unique_ptr<Derived>) ptr)->Doanotherjob(a,b,c); // ERROR
Это даже правильно делать? Какой синтаксис?
Если вы точно знаете, что downcast безопасен, вы можете использовать static_cast
,
static_cast<derived*>(ptr.get())->DoAnotherJob(...);
Тем не менее, если вы сделали DoAnotherJob()
виртуальный в base
тогда опускаться не нужно. Это гораздо более традиционный объектно-ориентированный подход.
Как указано в комментариях ниже, dynamic_cast
давайте сделаем это приведение и проверим результат:
if(auto d = dynamic_cast<derived*>(ptr.get())
d->DoAnotherJob();