提问者:小点点

构造函数初始值设定项列表不遵循顺序


我有以下代码:

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中,这个行为阻止了我这样做。


共1个答案

匿名用户

有什么办法可以让基构造函数在之后被调用吗?

不。对象的构造函数必须先构造其基函数。

我试图通过将它们放入构造函数中来摆脱所有的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;

};