我被困了,已经尝试了很多来解决这个“虚拟”问题,所以我求求你帮助我,因为它可能是一个愚蠢的“受过训练的眼睛”可以在几秒钟内解决..
问题:当我在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
}
答案 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”已经分配了内存,但似乎还有其他原因:)
此致