继承的构造函数

Inherit constructor

本文关键字:构造函数 继承      更新时间:2023-10-16

我有一个名为myGraph的类,它派生自graph

如果在调用构造函数时知道顶点的数量,就可以使用下面的构造函数。

myGraph(int numOfV) : graph(numOfV)
{
    // initialize...
}

我想计算构造函数中的顶点数,然后在构造函数中继承graph 。怎么做呢?

myGraph(int a, int b)
{
    /* using a,b to initialize...  
       a sequence of push operation on (vector<T>)verticeList */
    int numOfV = this->verticeList.size();
    // inherit...
    myGraph(numOfV);  // it will not work

}

请注意

  1. 我用来计算顶点数的程序很复杂。(多行代码而不是a+b)

  2. 顶点的数量取决于myGraph的实例变量,所以我需要先初始化myGraph的成员,然后继承剩余的graph部分。

如果有很多逻辑在进行预初始化,你可以在一个方法中分离它们:

struct myGraph
{
    myGraph(int a, int b) : graph(myGraph::computeNoVertices(a,b))
    {
    }
    static int computeNoVertices(int a, int b)
    {
        //whole chunk of code 
    }
};

必须在派生类的成员初始化列表中调用基类构造函数:

 myGraph(int a, int b) :graph(a +b)
 {                     //^^It is OK to do computation when you pass parameters to
                       //base class constructor
    // do something...
 }

在c++ 11中,您可以执行有限数量的操作:

myGraph(int a, int b)
  : myGraph(a+b)
{
}

如果你的计算要复杂得多,你会想把它们分解成一个单独的函数:

myGraph(int a,int b)
  : myGraph(calculateNumOfV(a,b))
{
}

顶点的数量取决于myGraph中的实例变量,所以我需要先初始化myGraph的成员,然后继承剩下的图部分。

那不可能。基类总是在数据成员之前初始化。然而,在构造过程中,分配给成员的值仅取决于构造函数参数,因此基类的构造函数参数也仅取决于这些参数。

假设你有成员m1m2,并且想用依赖于这两个成员的值初始化基类,比如f(m1,m2)g(m1,m2)。你的构造函数有参数a, b, c,你初始化m1m2依赖于这些参数,x(a,b,c)y(a,b,c)。然后该元素看起来应该像这样:

class Foo : Bar {
  int m1;
  int m2;
  static int x(int a, int b, int c);
  static int y(int a, int b, int c);
public:
  Foo(int a, int b, int c) 
    : Bar( f(x(a,b,c), y(a,b,c)), g(x(a,b,c), y(a,b,c)) )
    , m1(x(a,b,c))
    , m2(y(a,b,c)) 
  {}
};
当然,为了提高可读性,您可以创建更多的静态函数来计算基对象的初始化式:
class Foo : Bar {
  /* ... */
  static Bar calcBar(int a, int b, int c) {
    int i1 = x(a,b,c);
    int i2 = y(a,b,c);
    return Bar(f(i1,i2), g(i1,i2));
  }
public:
  Foo(int a, int b, int c) 
    : Bar( calcBar(a,b,c) )
    , m1(x(a,b,c))
    , m2(y(a,b,c)) 
  {}
};