使用带继承的构造函数基础和成员初始化列表

时间:2015-01-04 14:02:48

标签: c++ inheritance constructor default-constructor

我有一个关于如何使用初始化列表来构造派生类的构造函数的问题,这些构造函数继承自基类的构造函数。

这是有效的代码:

class base {

public:
  base():x(0) {}
  base(int a):x(a) {}

private:
  int x;
};

class derived : public base {

public:
  derived():base():y(0) { y=0; } 
  derived(int a, int b):base(a) { y=b; }

private:
  int y;
};

但是,我想使用成员初始化列表直接初始化变量,这会导致错误:

class base {

public:
  base():x(0) {}
  base(int a):x(a) {}

private:
  int x;
};

class derived : public base {
public:
  //derived():base():y(0) {}  //wrong
  //derived(int a, int b):base(a):y(b) {}  //wrong
  derived():base(), y(0) {}  // corrected
  derived(int a, int b): base(a), y(b) {}  //corrected

private:
  int y;
};

从另一个构造函数继承以使用初始化列表的构造函数的正确语法是什么?

谢谢:)

2 个答案:

答案 0 :(得分:1)

如Dieter所述,您可以在构造函数中轻松拥有许多初始值设定项,只需使用逗号(,)而不是列(:)进行分隔。

您派生的类应为:

class derived : public base {
public:
  derived():base(),y(0) {} 
  derived(int a, int b):base(a),y(b) {} 

private:
  int y;
};

答案 1 :(得分:0)

derivedClass::derivedClass(argumentsSetOne, argumentsSetTwo, .....) : baseClassOne(argumentsSetOne) , baseClassTwo(argumentsSetTwo) { }

顺序并不重要......我的意思是,您可以在Derived Class的构造函数的参数字段中指定argumentsSetTwo之前的argumentsSetOne。但同样它应该与原型中指定的相同....