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

时间:2014-01-23 23:17:34

标签: c++

假设我正在实施一个双人棋的游戏。为简单起见,这是我的实现的缩短版本,省略任何不相关的细节。我有一个类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;
};

以下是main的一个示例:

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

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

我的目的是在king的构造函数中初始化Board

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

从这里开始我希望King的构造函数调用color_t参数,从而调用Piece中的构造函数,如下所示:

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

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

1 个答案:

答案 0 :(得分:3)

你的语法错误(这是合法的,但不符合你的想法)。您需要在初始化列表中调用基类构造函数:

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

当您进入构造函数体时,所有基类和数据成员都已初始化。如果你没有显式初始化它们,它们会默认初始化(这意味着在基类的情况下调用默认构造函数)。

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