确定工厂方法返回的对象类(错误:函数不接受 1 个参数

Determine an object's class returned by a factory method (Error: function does not take 1 arguments

本文关键字:函数 错误 不接受 参数 工厂 方法 返回 对象      更新时间:2023-10-16

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

在我的代码中,工厂方法返回一个 bar 类型的指针,该指针明确指向类 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);
}

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

std::auto_ptr<baseclass> bar = classfactory::CreateBar();
if (derivedclass *der = dynamic_cast<derivedclass*>(bar.get())) {
  der->foo(5);
}

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

您可以将baseclass*转换为derivedclass*

使用 static_cast : 如果baseclass*的运行时类型不是 derivedclass* 的(子类),则得到未定义的行为。

使用 dynamic_cast : 如果baseclass*的运行时类型不是 derivedclass* 的(子类),则强制转换会产生一个空指针。为了允许此行为,将执行其他运行时检查。

现在你的柱线变量是基类类型,所以你不能执行 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);