派生类调用默认构造函数[重复]

Posted

技术标签:

【中文标题】派生类调用默认构造函数[重复]【英文标题】:Default constructor being called by derived class [duplicate] 【发布时间】:2014-02-14 18:41:02 【问题描述】:

假设我正在实现一个二人国际象棋游戏。为简单起见,这是我的实现的简化版本,省略了任何不相关的细节。我有一个类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 对象正在被垃圾初始化。

我的意图是让kingBoard 的构造函数中初始化:

Board() king = King(white);

从这里我想要调用来自 King 的构造函数,该构造函数接受一个 color_t 参数,从而调用来自 Piece 的构造函数,如下所示:

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

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

【问题讨论】:

Piece(K,'K',color); 创建一个临时对象。您需要使用 mem-initializer-list。 【参考方案1】:

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

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

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

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

【讨论】:

"wrong" = 做了一些与预期不同的事情 @dyp 在 OP 打算代码执行的上下文中是错误的 :) 谢谢+1;它解决了我的问题。你能简单解释一下为什么必须从初始化列表而不是构造函数体中调用它吗? 语法错误 @TylerGaona 解释在我的回答中。

以上是关于派生类调用默认构造函数[重复]的主要内容,如果未能解决你的问题,请参考以下文章

在其派生类C++的构造函数中调用基类的构造函数[重复]

与默认构造函数有关,CMFCPropertyGridProperty的派生类构造函数怎么写

生成一个派生类对象时,调用基类和派生类构造函数按啥次序

与默认构造函数有关,CMFCPropertyGridProperty的派生类构造函数怎么写

向基类添加默认构造函数会更改派生类型的 sizeof() [重复]

在派生类的构造函数中初始化没有默认构造函数的基类