C ++虚拟方法没有按需要调用

时间:2012-12-05 23:00:07

标签: c++

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

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

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

始终调用PrologConnector类的send方法,但不调用子类中的方法。 你看到了问题吗?

感谢您的帮助!!

这是代码: 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 个答案:

答案 0 :(得分:6)

您在这里的内容是 object slicing 。为了以多态方式使用对象,您通过指针或引用访问它们。

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

答案 1 :(得分:4)

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

改为使用指针或类的引用。

答案 2 :(得分:2)

以下是此方法中发生的情况:

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

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

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

答案 3 :(得分:0)

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

另一个提示:

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

我不得不使用“new”来实例化那个SWIConnector,否则我会在main函数中遇到“segment fault”。我不完全确定为什么,因为我认为“SWIConnector x”已经分配了内存,但似乎还有其他原因:)

此致