我有一个工厂方法,它要么返回baseclass的对象,要么返回derivedclass(baseclass的派生类)的对象。派生类具有一个带有一个参数的virtual void foo(int x)方法。但是baseclassvirtual 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);
}

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

关于c++ - 确定由工厂方法返回的对象的类(错误:函数不带1个参数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19446356/

10-11 22:24
查看更多