我有以下代码:
class Base
{
public:
Base(int test) { std::cout << "Base constructor, test: " << test << std::endl; }
};
class Derived : public Base
{
private:
int variable;
public:
Derived() :
variable(50),
Base(variable)
{}
};
Derived derived;
我希望输出是:“base constructor,test:50”,但事实并非如此,因为base
构造函数是在variable
初始化之前调用的,没有错误或警告,它只是编译。
有什么方法可以让base
构造函数在之后被调用吗?或者这是总体上的糟糕设计?
我正在尝试将所有的init方法和它们的调用放入构造函数insted中,这个行为阻止了我这样做。
有什么办法可以让基构造函数在之后被调用吗?
不。对象的构造函数必须先构造其基函数。
我试图通过将它们放入构造函数中来摆脱所有的init方法和它们的调用
那是值得的努力!
我假设您真正的代码变量
比int
更复杂。因为如果它是一个int,您可以简单地调用base(50)
。
可以使用延迟构造函数在任何构造函数开始之前准备变量。
class Derived : public Base
{
public:
// Generate an important value FIRST, and then delegate
// construction to a new constructor.
Derived() : Derived( GenerateSomethingComplex() ) {}
private:
// Here, we can honor constructing Base before Derived
// while "some value" has been procured in advance.
Derived( SomethingComplex&& var) :
Base(var),
variable( std::move(var) )
{}
SomethingComplex variable;
};