【问题标题】:C++ downcastingC++ 向下转型
【发布时间】:2013-02-17 17:59:28
【问题描述】:

这个问题是what I posted here的后续问题

Synth 实现了 Generator,Track 有一个 generator 成员(其中有一个 Synth)。我想做的是:

Track track = Track();
cout << track.generator.varA << endl;

但这不起作用,所以我猜我必须先以某种方式将生成器转换为 Synth,然后才能访问任何合成器方法或成员,但我不知道该怎么做。

【问题讨论】:

  • 如果您需要演员表,那么这意味着更好的设计是让Track 拥有指向Synth 的指针,而不是指向基类的指针。除非您正在做一些奇特的事情,否则沮丧通常是次优设计的标志。

标签: c++ interface casting member


【解决方案1】:

首先,generator 是一个指针,所以你不能像这里那样使用. 操作符来访问指向对象的成员:

track.generator.varA // ERROR!

其次,既然你想要一个指向派生类的指针,并且你有一个指向基类的指针,你应该使用dynamic_cast&lt;&gt;来获得一个(除非你确定指向的对象是派生类的一个实例,在这种情况下你可以使用static_cast&lt;&gt;):

Synth* p = dynamic_cast<Synth*>(track.generator);
if (p != nullptr)
{
    cout << p->varA << endl;
}

【讨论】:

  • 很好,这很有效。还有一个问题:我是否需要在完成后以某种方式删除*p
  • @Sled:使用new 分配的所有内容最终都必须使用delete 释放。
【解决方案2】:

当您确定您拥有的基指针确实是该派生类型时,要向下转换为派生类型,请执行以下操作:

static_cast&lt;Derived*&gt;(myBasePointer)

【讨论】:

    猜你喜欢
    • 2016-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    相关资源
    最近更新 更多