C++ 子类并使用基类初始化器

C++ 子类并使用基类初始化器,c++,class,derived-class,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::

我有这个:

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 over类得到更新,那么我也必须更新bar。如果bar能够自动初始化自身(它永远不会包含自己的数据成员),则更可取。

好吧,很简单:

bar::bar(const foo& x)
  : foo(x)
{
}
只需使用
foo
的复制构造函数。
{
之间的所有内容都称为初始值设定项列表。您可以直接初始化其中的成员和基类。对于
foo
,复制构造函数可以如下所示:

foo::foo(const foo& other)
  : a(other.a)
  , b(other.b)
  , c(other.c)
{
}
请注意,我通过const reference获取这两个参数,这是一个很好的做法,因为您不接触其他对象。还请注意,大多数情况下,仅当您的类包含原始指针时(例如
int*
),才不需要自己编写
foo
的副本构造函数。如果您不定义一个复制构造函数,而只是对所有数据成员进行一个浅层复制,编译器将自己生成一个复制构造函数。

很简单:

bar::bar(const foo& x)
  : foo(x)
{
}
只需使用
foo
的复制构造函数。
{
之间的所有内容都称为初始值设定项列表。您可以直接初始化其中的成员和基类。对于
foo
,复制构造函数可以如下所示:

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

请注意,我通过const reference获取这两个参数,这是一个很好的做法,因为您不接触其他对象。还请注意,大多数情况下,仅当您的类包含原始指针时(例如
int*
),才不需要自己编写
foo
的副本构造函数。如果您不定义一个复制构造函数,编译器将自己生成一个复制构造函数,而只是对所有数据成员进行一个浅层复制。

这难道不像确保Foo有一个复制构造函数那么简单吗

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

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

};

这难道不像确保Foo有一个复制构造函数那么简单吗

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

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

};

继承构造函数不能在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...
模板条(常数T1&x1):foo(x1){
模板条(常数T1和x1,常数T2和x2):foo(x1,x2){}
模板条(常数T1和x1,常数T2和x2,常数T3和x3):foo(x1,x2,x3){}
//只要你需要。。。

在C++0x中,使用单变量模板构造函数和完美转发。

继承构造函数在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...
模板条(常数T1&x1):foo(x1){
模板条(常数T1和x1,常数T2和x2):foo(x1,x2){}
模板条(常数T1和x1,常数T2和x2,常数T3和x3):foo(x1,x2,x3){}
//只要你需要。。。

在C++0x中,使用单变量模板构造函数和完美转发。

foo
,如问题中所述,已经有了默认的副本构造函数。您不必添加任何内容,只需调用它。我已经再次阅读了它,不知道它在哪里说foo已经有了副本构造函数。我以为他已经打印了整个副本在他的示例中,Foo的相关类定义。如果该类与问题中的类似,编译器将为其生成一个默认的副本构造函数,对所有元素进行按成员方式的复制。
Foo
,如问题中所示,已经有一个默认的副本构造函数。您不必添加任何内容,只需调用它。我已经再次阅读了它,并且我不知道上面说Foo已经有了一个复制构造函数。我以为他在他的例子中打印了Foo的整个相关类定义。如果类看起来像问题中的那样,编译器将为它生成一个默认的复制构造函数,对所有元素进行成员复制。哈?如果你只想要派生类的话要从基类初始化,这在C++03中肯定是可能的。@Xeo:copy initialized-可能。继承构造函数-不可能。只需尝试用一个新方法扩展
vector
,看看问题是什么……无论如何,这显然不是OP想要的…(尽管它也解决了他/她的问题).Huh?如果您只是希望派生类可以从基类初始化,这在C++03中当然是可能的。@Xeo:copy initialized-可能。继承构造函数-不可能。只需尝试使用新方法扩展
vector
,看看问题是什么……无论如何,显然这不是OP想要的。。。(尽管这也解决了他/她的问题)。