Как ссылаться на метод, определенный только в производном классе, используя указатель upcast unique_ptr в C ++?

Предположим, следующие классы

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

Это даже правильно делать? Какой синтаксис?

1

Решение

Если вы точно знаете, что downcast безопасен, вы можете использовать static_cast,

static_cast<derived*>(ptr.get())->DoAnotherJob(...);

Тем не менее, если вы сделали DoAnotherJob() виртуальный в baseтогда опускаться не нужно. Это гораздо более традиционный объектно-ориентированный подход.

Как указано в комментариях ниже, dynamic_cast давайте сделаем это приведение и проверим результат:

if(auto d = dynamic_cast<derived*>(ptr.get())
d->DoAnotherJob();
5

Другие решения


По вопросам рекламы [email protected]