1

我有一个工厂方法,它要么返回一个对象,要么返回一个对象 baseclassderivedclass的派生类baseclass)。派生类有一个virtual void foo(int x)接受一个参数的方法。baseclass然而有virtual void foo()没有论据。

在我的代码中,工厂方法返回一个 bar 类型的指针,该指针明确指向 class 的对象derivedclass。但是,由于这仅在运行时才知道,我得到一个编译器错误,说它foo()不带参数。我可以将此指针转换为类型的指针derivedclass吗?

std::auto_ptr<baseclass> bar  = classfactory::CreateBar(); //returns object of class derivedclass
bar->foo(5);

class baseclass
{
 public:
      virtual void foo();
}

class derivedclass : public baseclass
{
 public:
      virtual void foo(int x);
}
4

3 回答 3

3

要回答您的问题:static_cast如果您确定实例是正确的类型,则可以使用,dynamic_cast否则。像这样的东西:

std::auto_ptr<baseclass> bar = classfactory::CreateBar();

if (derivedclass *der = dynamic_cast<derivedclass*>(bar.get())) {
  der->foo(5);
}

然而,像这样的代码通常暗示着糟糕的设计。您不需要访问派生类的细节。也许基类接口没有应有的完整?

于 2013-10-18T09:45:39.930 回答
0

您可以将 abaseclass*转换为derivedclass*.

使用static_cast: 如果运行时类型baseclass*不是 (a subclass of) derivedclass*,你会得到未定义的行为。

使用dynamic_cast: 如果 的运行时类型baseclass*不是 (a subclass of) derivedclass*,则强制转换产生一个空指针。为了允许这种行为,会执行额外的运行时检查。

于 2013-10-18T09:40:22.530 回答
-1

现在你的 bar 变量是基类类型的,所以你不能执行 foo(int x)。您需要将其转换为适当的类型,如下所示:

std::auto_ptr<baseclass> bar  = classfactory::CreateBar(); //returns object of class derivedclass
std::auto_ptr<derivedclass> bar_derived(dynamic_cast<derivedclass*>(bar.get()) ? (static_cast<derivedclass*>(bar.release())) : 0 );
bar_derived->foo(5);
于 2013-10-18T09:47:28.010 回答