继承构造函数

时间:2013-06-06 03:10:57

标签: c++ class inheritance constructor

我有一个名为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部分。

4 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

使用C ++ 11,您可以执行以下有限的操作:

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

如果您的计算要复杂得多,您可能希望将它们分解为单独的函数:

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

答案 3 :(得分:0)

  

顶点的数量取决于myGraph中的实例变量,因此我需要首先初始化myGraph的成员,然后继承其余的图形部分。

这是不可能的。 基础类始终在数据成员之前初始化。但是,在构造期间,您为成员分配的值仅取决于构造函数参数,因此基类&#39;构造函数参数也仅依赖于这些参数。

假设您有成员m1m2,并希望使用依赖于这两个成员的值初始化基类,比如说f(m1,m2)g(m1,m2) 。您的构造函数具有参数abc,并且您使用m1和{初始化m2x(a,b,c)依赖于那些ctor参数{1}}。那么ctor应该是这样的:

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)) 
  {}
};