如何将基类子对象的成员初始化为0?

时间:2011-03-07 16:48:13

标签: c++ inheritance object

class A
{
  public: int a,b,c;
};

class B: public A
{
   public: int d;
   B():d(0){} // Some hackery needed here
};

int main()
{
   B obj;
   std::cout<< obj.a << std::endl; // garbage
   std::cout<< obj.b << std::endl; // garbage
   std::cout<< obj.c << std::endl; // garbage
   std::cout<< obj.d << std::endl; // 0
}

如何将子对象数据成员a,b和c初始化为0?我不被允许修改A类。

5 个答案:

答案 0 :(得分:8)

尝试

B() : A() , d(0){}

A()值初始化A,因为A是POD,所以成员将默认(零)初始化


答案 1 :(得分:4)

我测试了这个,因为我认为它可能有效(即使没有Prasoon的回答)

B::B() : A(), d(0)
{
}

可能有用,因为你正在“初始化”A。

顺便说一句,它没有。输出: 1,32,123595988

这会有效:

// put this in B.cpp anonymous namespace
const A a_init = { 0, 0 ,0 };

接下来是:

B::B() : A( a_init), d(0)
{
}

我正在使用g ++ 4.3.2进行测试。现在这个有效:

B::B() : A(A()), d(0)
{
}

答案 2 :(得分:1)

也许我错过了什么,但是这个怎么样?

class B: public A
{
    public: int d;
    B():d(0){a=b=c=0;}
}

答案 3 :(得分:1)

声明派生类构造函数,如下所示

class B: public A
{
   public: int d;
   B():a(0),b(0),c(0),d(0)
   {

   }

};

答案 4 :(得分:1)

正确的方法当然是让A的构造函数初始化它的成员。否则,由于成员不是私有的,您可以从B构造函数中为它们分配值。

a = 0;

等,实际上有效。