C ++在子类中调用基类构造函数

时间:2014-11-08 15:23:28

标签: c++ inheritance constructor super base

来自Java我对调用基类构造函数(或super())有点困惑。 我有2个类:播放器(抽象类),以及 HumanPlayer ,它是Player的子级。 现在,我有一个Player的构造函数,声明:

Player(string name, list<Point> points);

现在我想尝试实现这种方式:

HumanPlayer() {
    string name = get name from user...
    list<Point> points = get points from user...
    ...
    ...
    ...
    super(name, points);
}

对c ++来说真的很新,用它的语法很难。 的问候,

2 个答案:

答案 0 :(得分:3)

初始化派生类的基础的唯一方法是在构造函数的初始化列表中。这是冒号之后的事情,在函数体之前。没有其他 NORMAL 方法可以做到这一点。

HumanPlayer() :
        Player("...", list_of_points)
{
...
}

如果你真的必须在构造函数的主体中“而不是在列表中”初始化基类,则必须修改代码 - 例如通过在基类中引入“initialize()”函数或使用“pimpl成语”。

答案 1 :(得分:0)

如果“从用户获取名称...”和“从用户获取点...”位非常简单,并且可以实现为简单表达式或函数调用:

HumanPlayer()
   : Player( "get name from user... code",
             "get points from user... code")
{


}

另一方面,如果两个“get”位都是非平凡的,并且彼此之间存在相互依赖关系,那么这将会更复杂一些。这是一个典型方法的简要概述:

class HelperClass {

public:

    std::string name;
    std::list<Point> points;

    HelperClass()
    {
         // The constructor here will do whatever is needed to initialize name and points
    }
};


// ...

HumanPlayer(const HelperClass &helper=HelperClass())
 : Player(helper.name, helper.points)
{
}

有些人可能会发现这有点像hack-ish:滥用默认参数值来实例化构造函数中使用的对象。但它的确有效。如果使用至少支持C ++ 11标准的C ++编译器,可以用不同的方式稍微改善一下。