簡體   English   中英

從超類對象,虛擬函數中調用子類方法

[英]Calling subclass methods from superclass object, virtual functions

我正在設計一個國際象棋游戲(C ++初學者),但是我只能檢查單個棋子類型,例如典當一次只能移動1個空格,第一次則只能移動2個空格,依此類推。

我有一個片斷類,而它的子類是pawn,king等,其中包含以下方法:

check(string position,string destination);

並返回一個布爾值,是否可以移動到目的地。

我有一個指向我通過執行定義的每個部分的指針:

pawn pawnPieces[16];
piece *pointer[16];

for (i=0;i<16;i++)
{
    pointer[i]=&pawnPieces[i];
}

初步檢查后,我想從main調用上面的check函數作為測試:

cout << pointer[1]->check("B1","C1") << endl;

這給了我一個錯誤“沒有名叫'check'的成員”的錯誤,這是有道理的,但是我敢肯定會有一種方法將片斷類鏈接到典當,國王等。

我想我需要根據已閱讀的內容對虛函數做些事情,但是我不確定該如何處理。 如果有人可以提供一些建議,將不勝感激。

這種嘗試從上面的類的指針調用子類函數的方法可能存在根本缺陷,也許我需要修改設計才能實現此目標? 我仍然希望將pawn類的check方法保持在同一位置,因為我認為它可以很好地封裝它。

編輯:我在piece類中做了一個純虛函數:

virtual bool check(string positionIN,string destination)=0;

現在,當我調用上面的cout行時,出現了細分錯誤,並且不確定原因。 我假設這是因為我在使用指針?

EDIT2: 謝謝你! 我已經實現了,但是我遇到了一個小錯誤,虛擬意味着要附加到Pawn和King類嗎? 根據我的理解,我認為虛擬標簽僅在基類上使用。

EDIT3:我了解,我使用虛擬標記標記了pawn和king類中的check函數,並對其進行了編譯。

現在我通過調用對象本身遇到了分段錯誤

pawnPieces[1].check("B1","C1") 

並通過調用對象的指針

pointer[1]->check("B1","C1") 

從主要,我不確定為什么。

EDIT4:現在一切正常,我正在從main調用它進行測試,但是當我從程序中調用它時,一切正常,謝謝大家!

您試圖做的正是virtual方法的含義。

class piece
{
public:
    virtual bool check(string position, string destination) = 0;
};

class pawn : public piece
{
public:
    virtual bool check(string position, string destination)
    {
        return ...;
    }
};

class king : public piece
{
public:
    virtual bool check(string position, string destination)
    {
        return ...;
    }
};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM