3

我被困住了,已经尝试了很多来解决这个“虚拟”问题,所以我请求你帮助我,因为这可能是一个“训练有素的眼睛”可以在几秒钟内解决的愚蠢问题。

问题:当我在 main 中执行以下操作时:

PrologConnector swiProlog;
swiProlog = PrologConnector::connectorFactory(PrologConnector::swi,argv);
swiProlog.send("blabla");

总是调用 PrologConnector 类的发送方法,而不是子类的发送方法。你看到问题了吗?

谢谢您的帮助!!

这是代码:PrologConnector.h

class PrologConnector {
   virtual int send(char * cmd);
   virtual int init(char **argv);
   static PrologConnector connectorFactory(Prolog prolog, char ** argv);
};

PrologConnector.cpp

int PrologConnector::send(char * argv) {
  std::cout << "not wanted"<<std::endl;
  return 0;
}


int PrologConnector::init(char **argv) {
  //TODO add implementation
  return 0;
}


PrologConnector PrologConnector::connectorFactory(Prolog prolog, char **argv) {
  if (prolog == swi) {
    SWIConnector sc;
    sc.init(argv);
    return sc;
  }

std::cout <<"Error in initialization!"<<std::endl;
PrologConnector pc;
return pc;
}

SWIConnector.h:

class SWIConnector : public PrologConnector {
  int send(char *cmd);
  int init(char **argv);
};

SWIConnector.cpp:

int SWIConnector::init(char **argv) {
//some action going on
}


int SWIConnector::send(char * cmd) {

//some action going on
}
4

4 回答 4

6

您在这里拥有的是对象切片。为了多态地使用对象,您必须通过指针或引用来访问它们。

您的工厂方法的签名应更改为返回PrologConnector*or PrologConnector&,之后您将能够看到预期的行为。

于 2012-12-05T23:03:22.277 回答
4

这个问题很常见,被称为“切片”。您正在将派生类分配给基类的实例,并且派生类的所有属性在复制期间都将丢失。

请改用指向类的指针或引用。

于 2012-12-05T23:04:06.070 回答
2

这是此方法中发生的情况:

PrologConnector PrologConnector::connectorFactory(Prolog prolog, char **argv) {
  if (prolog == swi) {
    SWIConnector sc;
    sc.init(argv);
    // return sc;
    return PrologConnector(sc);
  }

当您返回 PrologConnector 类型的变量时。并且将调用 PrologConnector 的方法。

您需要返回指针而不是对象的副本。

于 2012-12-05T23:05:22.530 回答
0

感谢您的回答,这正是发生的事情.. 以前从未听说过 :)

另一个提示:

PrologConnector* PrologConnector::connectorFactory(Prolog prolog, char **argv) {
  if (prolog == swi) {
  SWIConnector *sc = new SWIConnector;
  sc->init(argv);
  return sc;
} 

我必须使用“new”来实例化那个 SWIConnector,否则我会在主函数中得到一个“分段错误”。我不完全确定为什么,因为我认为“SWIConnector x”已经分配了内存,但似乎还有另一个原因:)

问候

于 2012-12-07T21:59:13.167 回答