在C ++中快速将基础对象的所有成员分配给派生对象

时间:2016-09-26 01:53:19

标签: c++ inheritance assignment-operator

假设我们有一个基类和一个派生类:

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 返回的基础对象?

3 个答案:

答案 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/