C ++:正确初始化抽象类的构造函数

时间:2017-10-25 08:28:19

标签: c++ abstract-class

初始化抽象类的构造函数的正确方法是什么?我在cc文件中注释掉了构造函数,它似乎正在工作,我想了解原因。

板。 H Board.h是一个抽象类,因为它没有包含2个纯虚函数。

class Board {
public:
   Board(size_t width, size_t height)
    : width(width), height(height) {}

   virtual ~Board() {}
....

protected:
//this is line 54
size_t height;
size_t width;
};

我的localBoard.h

#include <Board.h>
class LocalBoard : public Board {

public:

  LocalBoard(size_t width, size_t height) :Board(width),Board(height) {}

  ~LocalBoard() {}

 ...
};

LocalBoard.cc

#include <board/LocalBoard.h>
    // commenting this out fixed the error
    //LocalBoard(size_t width, size_t height) {}

error: multiple initializations of constructor

在另一个注释中,有人可以帮助我理解以下警告的含义,它对我的​​程序有什么影响以及如何解决它?我认为它再次与构造函数有关。

  ./include/board/Board.h: In constructor ‘Board::Board(size_t, size_t)’:
  ./include/board/Board.h:54:9: warning: ‘Board::width’ will be              initialized    after [-Wreorder]
   size_t width;

1 个答案:

答案 0 :(得分:0)

您已在此行中提供了类LocalBoard的ctor的内联实现:

LocalBoard(size_t width, size_t height) :Board(width),Board(height) {}

你不能给同一个ctor两次(一次内联,一次在cc文件中)。

你需要写

class LocalBoard {
    LocalBoard(size_t width, size_t height) :Board(width, height) {}
};

class LocalBoard {
    LocalBoard(size_t width, size_t height);
}

// probably in the cc file:
LocalBoard::LocalBoard(size_t width, size_t height) : Board(width, height)
{
}

请注意,我将两个基类ctor调用Board(width),Board(height)更改为一个基类ctor调用Board(width, height)

注意警告,您可以查看What's the point of g++ -Wreorder?