2012-12-05 50 views
3

我被卡住,已經嘗試了很多解決這個「虛擬」的問題,所以我求求你幫我,因爲它可能是一些愚蠢的事,一個「訓練有素的眼睛」,可以在幾秒鐘內解決..不叫爲C++虛方法所需

的問題:當我在主要如下:

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 
} 
+1

您只能如果您創建通過基類調用重寫功能指向基類的對象,並用派生類的實例初始化它。 –

+0

[C++中的切片問題](http://stackoverflow.com/questions/274626/what-is-the-slicing-problem-in-c) – jrok

回答

6

你這裏是什麼object slicing。爲了多態使用對象,你通過指針或引用來訪問它們。

工廠方法的簽名應更改爲返回PrologConnector*PrologConnector&,之後您將能夠看到預期行爲。

+0

或者是一個參考。 –

+0

@NikosC .:感謝您的輸入,編輯回答。 – Jon

+0

是 - 連接器工廠應該返回一個對創建對象的引用,該對象應該分配在堆上。 – antlersoft

4

的問題是常見的,被稱爲「切片」。您將派生類分配給基類的實例,並且派生類的所有屬性在複製過程中都將丟失。

使用指針或參考類代替。

2

下面是這種方法會發生什麼:

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

爲您返回類型PrologConnector的變量。 PrologConnector的方法將被調用。

您需要返回指針,而不是對象的副本。

+0

他們不是Stack對象嗎? –

0

感謝您的答案,那就是到底發生了什麼..從來沒有聽說過,以前:)

另一個提示:

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

我不得不用「新」來實例化SWIConnector,否則我在主函數中出現「分段錯誤」。我不完全知道爲什麼,因爲我認爲「SWIConnector X」已分配內存,但似乎是另一個原因:)

問候