默认构造函数由派生类调用

Default constructor being called by derived class

本文关键字:调用 派生 构造函数 默认      更新时间:2023-10-16

假设我正在实现两人国际象棋的游戏。这是为简单起见的我实施的缩短版本,省略了任何无关的细节。我有一个Piece类,从中得出各种零件。在此示例中,我只包括King件。

extern enum piece_t;
extern enum color_t;
class Piece
{
public:
    Piece() {}
    Piece(piece_t t, char r, color_t c)
        : type(t), representation(r), color(white)
        {}
    char getRepresentation()
        { return representation; }
protected:
    piece_t type;
    color_t color;
    char representation;
};
class King : public Piece
{
public:
    King() {}
    King(color_t color) { Piece(K,'K',color); }
};

在另一个类中,Board我定义了成员来实例King

class Board
{
public:
    Board() { king = King(white); }
    friend ostream& operator<<(ostream&, const Board&);
private:
    King king;
};

这是主要的示例:

int main(void)
{
    Board game;
    std::cout << game;
    return 0;
}

问题是默认构造函数正在调用。我知道这发生了,因为我的king对象是用垃圾初始化的。

我的意图是要在Board的构造函数中初始化king

Board() { king = King(white); }

从这里我想要King的构造函数,该构造函数将调用color_t参数,从而将Piece的构造函数称为So:

King(color_t color) { Piece(K, 'K', color); }

这不是发生的事情。默认构造函数(KingPiece或两者都)。king的默认构造函数是否在Board的私有字段中声明?如果是这种情况,我该如何更改代码以使king调用适当的构造函数?

您的语法错误(这是合法的,但没有您的想法)。您需要在 initizaton list 中调用基类构造函数:

King(color_t color) : Piece(K,'K',color) {}

当您进入构造函数时,所有基类和数据成员已经初始化。如果您不明确初始化它们,则将获得默认初始化(这意味着在基类中调用默认构造函数)。

在您的代码中,您正在实例化本地的匿名Piece对象。