请记住,基类在初始化之前构造函数体被输入。因此,用你的方法,你首先初始化base
,然后通过赋值覆盖它。这不好。
使用委托构造和私人助手功能:
class derived : public base {
private:
static int help() { /* Do some stuff */ }
// private constructor to be called with the helper values
derived (int i) : base (i) { }
public:
derived() : derived (help()) { }
};
当然,在这种情况下,你可以只通过
derived() : base (help()) { }
定义构造函数然而上述委托构造方法变得有用如果必须为基类构造函数计算多个参数值:
class base {
public:
base (int i, double d);
};
class derived : public base {
private:
struct BaseParams { int i; double d; };
static BaseParams help() {
BaseParams p;
/* Do some stuff and set p.i and p.d */;
return p;
}
// private constructor to be called with the helper values
derived (BaseParams const & p) : base (p.i, p.d) { }
public:
derived() : derived (help()) { }
};
如果你真的想构建一个base
对象和移动它,使用基地的转移构造函数:
class base {
public:
base (int i, double d);
base (base &&);
};
class derived : public base {
private:
static base help() {
/* Do some stuff and finally construct a base object */;
return base { /* calculated parameters for constructor of base */ };
}
// private constructor to be called with a base object to move from
derived (base && b) : base (std::move (b)) { }
public:
derived() : derived (help()) { }
// or simply derived() : base (help()) { }
};
定义“似乎并没有工作。”另外,你为什么要做这样的事情?只需用正确的编号直接构建'base'即可。 – Barry
@Barry:从它的外观来看,当'base'构造函数被调用时,这个数字可能还不知道,所以它不能在构造函数参数中传递。 –
我假设'Base(num1)'你的意思是'base(num1)'? –