假设我们有一个基类和一个派生类:
class Base {
string s1;
string s2;
...
string s100; // Hundreds of members
};
class Derived : public Base{
string s101;
};
我想将一个Base对象base
分配给Derived对象derived
。我知道我们不能只使用运算符" ="将基础对象分配给其派生对象。
我的问题是:我们是否必须逐个复制所有成员?像:
derived.s1 = base.s1;
derived.s2 = base.s2;
...
derived.s100 = base.s100;
有没有更快或更简洁的方法来做到这一点?重载operator = with 返回的基础对象?
答案 0 :(得分:2)
我知道我们不能只使用operator“=”来为它分配一个基础对象 派生对象。
当然你可以(在这个问题的背景下):
static_cast<Base &>(derived)=base;
股票示例:
class Base {};
class Derived : public Base {};
void foo()
{
Derived d;
Base b;
static_cast<Base &>(d)=b;
}
答案 1 :(得分:2)
我想将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;
答案 2 :(得分:0)
我知道我们不能只使用operator“=”将基础对象分配给它的派生对象
那不是真的。
我们是否必须逐一复制所有成员?喜欢: base.s1 = derived.s1; base.s2 = derived.s2; ... base.s100 = derived.s100;
不是真的。正如Danh的第一条评论所述。
base = derived
就足够了,因为它执行隐式动态上传(即从指针到派生转换到指针到基础)。见http://www.cplusplus.com/doc/tutorial/typecasting/