子类并使用基类初始化器

时间:2011-06-07 08:28:22

标签: c++ class derived-class

我有这个:

class foo {
public:
  int a;
  int b;
  int c;
};

哪个好,但是我想在不修改类foo的情况下添加一些运算符重载:

class bar: public foo {
  operator==(const bar &x) const {
    return a == x.a;
  }
}

到目前为止很好,但是现在我需要使用从另一个类获得的对象数组来初始化bar。没问题,我可以在专用的构造函数中将所有foo变量复制到bar:

bar::bar(foo &x) {
  a = foo.a;
  /* etc */
}

但是这看起来很混乱,如果类foo结束了,那么我也必须更新吧。如果bar可以自动初始化(它永远不会包含自己的数据成员),那就更好了。

3 个答案:

答案 0 :(得分:2)

并不像确保Foo有复制构造函数那么简单.......

bar::bar(foo &x) 
: foo(x)
{
}

class foo {
foo::foo(foo &x)
{
  a = foo.a; /* etc */
}

};

答案 1 :(得分:1)

嗯,轻松:

bar::bar(const foo& x)
  : foo(x)
{
}

只需使用foo的复制构造函数。 :{之间的所有内容都称为初始化列表。您可以直接在其中初始化您的成员和基类。对于foo,复制构造函数可能如下所示:

foo::foo(const foo& other)
  : a(other.a)
  , b(other.b)
  , c(other.c)
{
}

请注意,我通过const引用获取两个参数,这是一个很好的做法,因为您没有触及其他对象。另请注意,只有当您的类包含原始指针(例如foo)时,大多数情况下都不需要自己编写int*的复制构造函数。如果你没有定义一个拷贝,并且只是为所有数据成员做一个浅拷贝,编译器就会生成一个拷贝ctor。

答案 2 :(得分:0)

继承构造函数不能在C ++ 03中完成,但可以近似。添加这些构造函数:

template<class T1> bar(const T1& x1) : foo(x1) {}
template<class T1, class T2> bar(const T1& x1, const T2& x2) : foo(x1, x2) {}
template<class T1, class T2, class T3> bar(const T1& x1, const T2& x2, const T3& x3) : foo(x1, x2, x3) {}
// as much as you need...

在C ++ 0x中使用单个可变参数模板化构造函数并完美转发。