稍后在C ++中调用基类构造函数(不在初始化列表中)

时间:2010-09-29 11:15:26

标签: c++ constructor delayed-execution

我正在继承一个类,我想调用它的一个构造函数。但是,在调用它之前,我必须处理一些东西(不需要基类的任何东西)。有什么办法我可以稍后调用它而不是在初始化列表中调用它吗?我相信这可以用Java和C#完成,但我不确定C ++。

我需要在构造函数上传递的数据以后不能重新分配,因此我不能只调用默认构造函数并稍后对其进行初始化。

5 个答案:

答案 0 :(得分:29)

  

有什么办法可以稍后调用它而不是在初始化列表中调用它吗?

不,你不能。必须在初始化列表中调用基类构造函数,并且必须首先调用它。

事实上,如果你在那里省略它,编译器将隐式添加调用。

  

我相信这可以用Java和C#完成,但我不确定C ++。

C#和Java都不允许这样做。

所做的事情是将方法称为基类构造函数调用的参数。然后在构造函数之前处理它:

class Derived {
public:
    Derived() : Base(some_function()) { }

private:
    static int some_function() { return 42; }
};

答案 1 :(得分:15)

正如几位回答者所说,你不能延迟调用基类构造函数,但Konrad has given a good answer可能很好地解决你的问题。但是,这确实有它的缺点(例如,当你需要用计算共享中间结果的值初始化几个函数时),所以只是为了完成,这是解决固定初始化顺序问题的另一种方法,通过使用它。

鉴于初始化的固定顺序,如果你可以控制派生类(以及你怎么会改变其中一个ctors?),你可以偷偷进入私有基础,以便初始化它在另一个基数之前,然后可以使用私有基数已经计算的值进行初始化:

class my_dirty_little_secret {
  // friend class the_class;
public: 
  my_dirty_little_secret(const std::string& str)
  {
    // however that calculates x, y, and z from str I wouldn't know
  }
  int x;
  std::string y;
  float z;
};

class the_class : private my_dirty_little_secret // must be first, see ctor
                , public the_other_base_class {
  public:
    the_class(const std::string str)
      : my_dirty_little_secret(str)
      , the_other_base_class(x, y, z)
    {
    }
  // ...
};

my_dirty_little_secret类是私有基础,因此the_class的用户无法使用它,所有内容都是私有的,只有the_class访问它的显式友谊。但是,由于它在基类列表中首先列出,它将在the_other_base_class之前可靠地构建,因此无论它计算什么都可以用来初始化它。
基类列表中的一个很好的注释可以防止其他人通过重构来破坏事物。

答案 2 :(得分:1)

恕我直言,我认为不可能以你提到的方式推迟调用基类构造函数。

答案 3 :(得分:0)

哇,我们都曾经年轻。这个答案不起作用,所以不要使用它。内容仅供参考。

如果您可以完全控制基类,我建议添加一个受保护的方法来进行类初始化,将其设置为虚拟,并在调用它的基础之前将派生类的实现细节放入其中:

class Base
{
public:
    Base()
    {
        Initialize();
    }
protected:
    virtual void Initialize()
    {
        //do initialization;
    }
};

class Derived : Base
{
public:

    Derived() : Base()
    {
    }
protected:
    virtual void Initialize()
    {
        //Do my initialization
        //call base
        Base::Initialize();
    }
};

答案 4 :(得分:-2)

struct base{
   base(int x){}
};

struct derived : base{
   derived(int x) : base(x){}
};

这是从派生类的初始化列表在C ++中调用基类构造函数的方法。