3

私は立ち往生していて、この「仮想」問題を解決するためにすでにたくさんのことを試みました。それで、私を助けてください。「訓練された目」が数秒で解決できるのはおそらく愚かなことです。

問題:メインで次のことを行うと:

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

4 に答える 4

6

ここにあるのはオブジェクトスライスです。オブジェクトを多態的に使用するには、ポインタまたは参照を介してオブジェクトにアクセスする必要があります。

ファクトリメソッドのシグニチャを変更して、PrologConnector*またはを返す必要が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;
} 

そのSWIConnectorをインスタンス化するために「新規」を使用する必要がありました。そうしないと、メイン関数で「セグメンテーション違反」が発生します。「SWIConnectorx」がすでにメモリを割り当てていると思ったので、理由は完全にはわかりませんが、別の理由があるようです:)

よろしく

于 2012-12-07T21:59:13.167 に答える