假设以下课程

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

那是正确的事吗? 语法是什么?

#1楼 票数:5 已采纳

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

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

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

如下面的注释所述, dynamic_cast让您执行此转换并验证结果:

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

  ask by peyman translate from so

未解决问题?本站智能推荐:

1回复

如何通过多态引用传递unique_ptr?

我有一个纯虚拟类Base和一些派生类ChildA (A/B/C 等): 我需要对这些子类的所有权进行特定控制,因此我通过工厂函数和std::unique_ptr生成它们。 在它们的创建/设置过程中的某个时刻,我需要以所有派生类通用的方式修改它们(而不是复制或更改所有权),因此我想使用一个接受它
1回复

为什么从 unique_ptr 自动向上转换到 unique_ptr 在这个例子中失败了?

ControllerSender是基类,有几个类将是它的直接子类(在本例中只有BasicSender )并通过工厂函数MidiControllers::AddSender实例化。 指向实例化对象的指针以及其他信息存储在映射中。 在地图中构建信息的顺序是首先使用AddController获取键 (
1回复

没有使用函数指针参数的隐式转换?

我遇到过这种奇怪的情况。 我希望指针隐式转换: 我期望将void(*)(DerivedClass *)分配给void baseClassArgFunc(BaseClass * arg)是安全的。 我糊涂了。 我猜没有函数指针参数的隐式转换吗?
1回复

为什么步骤3中'*ptr'的值不等于3而是0?

我发现步骤 3 中 '*ptr' 的值不等于 3
2回复

在节点中使用原始指针,在树中使用unique_ptr

我是一个业余程序员,试图找到将unique_ptr放在我的二进制树中的适当位置。 最初,我对左,右子节点使用了unique_ptr ,但是每个节点“拥有”每个后续节点的“含义”。 在上一篇文章中有人告诉我,树应该拥有其节点。 这是我对这个问题的解决方案:所有树节点都存储在唯一指针的向量中,
1回复

无法将指针向上转换为指针参数

我在这里什么都不懂。 我希望,如果我可以将dog指针传递给采用动物指针的函数,也可以将&dog传递给采用指向Animal指针的函数。 我只是不明白,有谁能解释为什么特定案例起作用而其他案例不起作用的原因是什么? 就像将狗的指针地址传递给Animal **一样,这是一个错误,不是吗?
5回复

上传指针参考

我有以下人为的例子(来自实际代码): 当我尝试编译时,我得到: 1)显然gcc被构造函数混淆了。 如果我从构造函数中删除引用,那么代码将编译。 所以我的假设是上传指针引用出了问题。 谁能告诉我这里发生了什么? 2)一个稍微不相关的问题。 如果我要在构造函数中执行像“
1回复

使用unique_ptr向量的原始指针作为ID进行排序

我想问一下这是否是一个好习惯。 让我们假设这种情况: 使用此向量的原始指针(向量中每个unique_ptr的原始指针)是否安全? 我知道向量可能会在超过保留空间时重新分配数据,但这只会影响unique_ptr的地址,而内部原始指针却保证保持不变? 因此,通过使用这些原始指针而不