施工调用指令(C ++)

时间:2012-02-21 11:32:54

标签: c++ inheritance

我有两个继承自同一个抽象超类的子类。所有子类都有一个共同的操作,它依赖于几个属性。让我用一个例子来解释:

假设这是超类A(A是抽象的):

class superClass
{
  int valueA;
  int valueB;
  float* array;

   public superClass(){
      array[valueA + valueB]
   }

   virtual foo(){
   }

}

这些是我的子类:

class firstSubClass: superClass
{

   public firstSubClass():superClass(), valueA(100),valueB(2){
   }

   foo(){
   }

}

class secondSubClass: superClass
{

   public secondSubClass():superClass(), valueA(50),valueB(3){
   }

   foo(){
   }

}

阵列是否正确初始化?转换为,是在superClass之前调用的子类构造函数,还是反过来?

有没有办法通过将它们放入superClass来使两个子类共同的初始化行为?

提前致谢。

2 个答案:

答案 0 :(得分:4)

首先调用superClass构造函数。

superClass构造函数应负责初始化superClass's数据成员 并且firstSubClass应该初始化自己的数据成员并调用superClass's构造函数;

有关构造函数调用顺序here的更多信息,您可能还想了解构造函数初始化列表here

所以,我会将superClassfirstSubClasssecondSubClass定义为:

class superClass
{
  int valueA;
  int valueB;
  float* array;

  public:

   superClass( int a , int b ): valueA(a),valueB(b) {

      array = new float[valueA + valueB];
   }
   virtual foo(){
   }

}



class firstSubClass: public superClass
{

   public:

   firstSubClass():superClass(100,2){ //calls superclass's constructor
   }

   foo(){
   }

}

class secondSubClass: public superClass
{

   public :

   secondSubClass():superClass(50 , 3){
   }

   foo(){
   }

}

答案 1 :(得分:1)

如果我理解得很好,你需要超类在构造任何子类时创建(不仅仅是初始化)一个浮点数组。在创建继承类的实例时,首先调用基类构造函数,然后需要将valueA和valueB值传递给它 - 您需要将它们作为构造函数参数添加:

superClass::superClass(int valueA, int valueB) : 
   valueA(valueA), valueB(valueB), array(0)
{
   // now create an array of requested length - allocate memory for it
   array = new float[valueA + valueB];
}

// don't forget to deallocate memory for it (possibly in destructor)
superClass::~superClass()
{
   delete[] array;
   array = 0;
}

然后,当您创建继承类的实例时,可以提供valueA和valueB作为超类构造函数的参数:

firstSubClass::firstSubClass() : superClass(100, 2)
{
   //...
}

使用硬编码值(幻数)不是一个好习惯,所以最好将valueA和valueB添加为子类构造函数参数:

firstSubClass::firstSubClass(int valueA, int valueB) : superClass(valueA, valueB)
{
   //...
}

最后,你应该避免使用数组。这是C ++,使用std::vector<float>,它更安全,更容易使用!