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

C++ 确定一个对象';工厂方法返回的s类(错误:函数不接受1个参数,c++,inheritance,factory-pattern,C++,Inheritance,Factory Pattern,我有一个factorymethod,它要么返回一个基类的对象,要么返回一个派生类(一个基类的派生类)的对象。派生类有一个方法虚空foo(int x),该方法接受一个参数。基类但是有虚空foo()没有参数 在我的代码中,工厂方法返回一个bar类型的指针,该指针明确指向类derivedclass的对象。但是,由于这只在运行时才知道,因此我得到一个编译器错误,表示foo()不接受参数。 我可以将此指针强制转换为derivedclass类型的指针吗 std::auto_ptr<baseclass&

我有一个factorymethod,它要么返回一个
基类
的对象,要么返回一个
派生类
(一个
基类
的派生类)的对象。派生类有一个方法
虚空foo(int x)
,该方法接受一个参数。
基类
但是有
虚空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);
}
std::auto_ptr bar=classfactory::CreateBar();//返回类derivedclass的对象
酒吧->美食(5);
类基类
{
公众:
虚拟void foo();
}
类派生类:公共基类
{
公众:
虚空foo(intx);
}

您可以将
基类*
强制转换为
派生类*

使用
static\u cast
:如果
baseclass*
的运行时类型不是(派生类的子类)
derivedclass*
,则会得到未定义的行为


使用
动态\u cast
:如果
基类*
的运行时类型不是(的子类)
derivedclass*
,强制转换将产生一个空指针。要允许此行为,将执行额外的运行时检查。

回答您的问题:如果您确定实例的类型正确,则可以使用
静态强制转换
,否则可以使用
动态强制转换
。类似于以下内容:

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

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

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

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

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

if (derivedclass *der = dynamic_cast<derivedclass*>(bar.get())) {
  der->foo(5);
}
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);
std::auto_ptr bar=classfactory::CreateBar();//返回类derivedclass的对象
std::auto_ptr bar_派生(动态_转换(bar.get())?(静态_转换(bar.release()):0);
bar_衍生->foo(5);

这看起来像是一个设计问题:您应该只访问
基类
方法。必须知道基类指针指向的类型会破坏多态性的目的。还要注意的是,基类需要有一个虚拟析构函数,否则会出现未定义的行为(可能包括内存泄漏)当您通过指向
baseclass
的指针销毁
derivedclass
实例时(例如
bar
超出范围)。OT:您应该使用baseclass::foo放置
。因为
foo()
隐藏在
derivedclass
中,这听起来非常合理。我将基类方法foo()更改为foo(int x)@在同一对象上跨多个接口的Angew依赖项注入是使用
std::dynamic_pointer_cast
的完美理由。如果您不熟悉
auto_ptr
的功能,您应该查找它并确保发布的代码有效。-1:此代码存在双重删除问题。现在只需在使用
栏之前添加一个检查_派生的
(可能为空),解释如果强制转换成功,
将清空,并且您有可用的代码。