提问人:Emerson Xu 提问时间:9/26/2016 最后编辑:songyuanyaoEmerson Xu 更新时间:9/26/2016 访问量:68
在 C++ 中快速将基对象的所有成员分配给派生对象
Quickly assign all the members of a base object to a derived object in C++
问:
假设我们有一个基类和一个派生类:
class Base {
string s1;
string s2;
...
string s100; // Hundreds of members
};
class Derived : public Base{
string s101;
};
我想将 Base 对象分配给 Derived 对象。我知道我们不能只使用运算符“=”将基本对象分配给其派生对象。
我的问题是:我们是否必须将所有成员一一复制?喜欢:base
derived
derived.s1 = base.s1;
derived.s2 = base.s2;
...
derived.s100 = base.s100;
有没有更快或更简洁的方法可以做到这一点?重载运算符= 返回的基本对象?
答:
2赞
Sam Varshavchik
9/26/2016
#1
我知道我们不能只使用运算符“=”将基本对象分配给其 派生对象。
当然,您可以(在这个问题的上下文中):
static_cast<Base &>(derived)=base;
股票示例:
class Base {};
class Derived : public Base {};
void foo()
{
Derived d;
Base b;
static_cast<Base &>(d)=b;
}
评论
0赞
Emerson Xu
9/26/2016
谢谢,我会尝试这个static_cast。但是,即使在这种情况下,这也是一种好的做法吗?
0赞
Sam Varshavchik
9/26/2016
@M.M - 不符合 gcc 6.1.1:“t.C:12:4:error: no match for 'operator=' (opperand types are 'Derived' and 'Base')”
0赞
M.M
9/26/2016
@SamVarshavchik很公平
0赞
HazemGomaa
9/26/2016
#2
我知道我们不能只使用运算符“=”将基本对象分配给其派生对象
那不是真的。
我们是否必须将所有成员一一复制?喜欢: base.s1 = 派生.s1; base.s2 = 派生.s2; ... base.s100 = 派生.s100;
没有。正如 Danh 的第一条评论中提到的。
base = derived
就足够了,因为它执行隐式动态向上转换(即从指针到派生到指针转换为指向基的指针)。查看 http://www.cplusplus.com/doc/tutorial/typecasting/
2赞
songyuanyao
9/26/2016
#3
我想将 Base 对象基础分配给派生的 Derived 对象。
为其提供重载:operator=
class Derived : public Base {
Derived& operator=(const Base& b) {
Base::operator=(b); // call operator= of Base
s101 = something; // set sth to s101 if necessary
return *this;
}
};
那么你可以
Base b;
// ...
Derived d;
// ...
d = b;
评论
Base
Base
operator=()
Derived
base=derived
base = derived;
derived = base;