1

假设以下类

class Base
{
   void Doajob(a,b){...}
}

class Derived: public Base
{
   void Doanotherjob(a,b,c){...}
}

我定义了一个指针,如下所示:

 auto ptr= unique_ptr<Base>(new Derived(name));

现在我想使用 ptr 指针访问 Doanotherjob:

ptr->Doanotherjob(a,b,c); // ERROR
((unique_ptr<Base>) ptr)->Doanotherjob(a,b,c); // ERROR
((unique_ptr<Derived>) ptr)->Doanotherjob(a,b,c); // ERROR

这甚至是正确的做法吗?语法是什么?

4

1 回答 1

5

如果您确定向下转换是安全的,则可以使用static_cast.

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

但是,如果您在 中进行了DoAnotherJob()虚拟base化,则无需进行向下转换。这是一种更为传统的面向对象方法。

如以下评论中所述,dynamic_cast让我们进行此转换并验证结果:

if(auto d = dynamic_cast<derived*>(ptr.get())
   d->DoAnotherJob();
于 2015-03-30T20:44:47.020 回答