C ++:使用计算参数调用基类构造函数

时间:2012-04-21 16:17:06

标签: c++ oop constructor

这个简单的例子演示了调用基类构造函数的C ++语法 - 据我所知,它是一个C ++学习者:

class BaseClass {
protected:
  int i;
public:
  BaseClass(int x) { 
     i = x; 
  }
};

class DerivedClass: public BaseClass {
  int j;
public:
  DerivedClass(int x, int y): BaseClass(y) { 
     j = x; 
  }

这里,基类构造函数可以将派生类构造函数的命名参数作为输入。

现在,如果我想使用不是BaseClass()的直接输入的输入值调用DerivedClass()构造函数,该怎么办?基本上,我想在x内使用yDerivedClass()进行多线工作,然后将计算值传递给BaseClass()。这可以用构造函数完成吗?这应该用某种初始化方法来完成吗?

3 个答案:

答案 0 :(得分:11)

你可以这样做,是的:

class BaseClass
{
  public:
    BaseClass(int x) : i(x) {}

  private:
    int i;
};

class DerivedClass: public BaseClass
{
  public:
    DerivedClass(int x, int y):
      BaseClass(compute(x, y)), // Neither i or j are initialized here yet
      j(x)
      {}

  private:
    static int compute(int a, int b) { return a + b; } // Or whatever
    int j;
};

请注意,您甚至可以将compute()设为非静态方法,但要注意当时DerivedClassBaseClass成员 不会被初始化电话。所以你将无法依赖他们的价值观。

答案 1 :(得分:3)

如果您使用的是C ++ 11或更高版本,您还可以使用lambda表达式:

class BaseClass
{
  public:
    BaseClass(int x) : i(x) {}

  private:
    int i;
};

class DerivedClass: public BaseClass
{
  public:
      DerivedClass(int x, int y): BaseClass(
          [=]()->int
            {
                int sum = 0;
                for(int i = 0; i < x; ++i)
                {
                    sum += y + i * x;
                }
                return sum;
            }()), j(x)
      {}

  private:
    int j;
};

答案 2 :(得分:2)

然后你可以这样做:

DerivedClass(int x, int y): BaseClass(compute(x,y)), j(y) { 
     //j = x;  //use member-initialization-list ---> ^^^^
  }

int compute(int x, int y) 
{
     //your code
}