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想要的。。。(尽管这也解决了他/她的问题)。