使用具有继承性的构造函数基类和成员初始值设定项列表

Using constructor base and member initializer list with inheritance

我有一个问题,关于如何为派生 class 的构造函数使用初始值设定项列表,这些构造函数继承自基础 class 的构造函数。

这是有效的代码:

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;
};

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

谢谢:)

正如 Dieter 所指出的,您可以很容易地在构造函数中包含许多初始化程序,它们只需用逗号 (,) 而不是列 (:) 分隔即可。

你class导出应该是:

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

private:
  int y;
};
derivedClass::derivedClass(argumentsSetOne, argumentsSetTwo, .....) : baseClassOne(argumentsSetOne) , baseClassTwo(argumentsSetTwo) { }

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