C++ 在C+;中,快速将基础对象的所有成员指定给派生对象+;

C++ 在C+;中,快速将基础对象的所有成员指定给派生对象+;,c++,inheritance,assignment-operator,C++,Inheritance,Assignment Operator,假设我们有一个基类和一个派生类: class Base { string s1; string s2; ... string s100; // Hundreds of members }; class Derived : public Base{ string s101; }; 我想将基础对象Base分配给派生对象Derived。我知道我们不能只使用运算符“=”将基础对象分配给其派生对象。 我的问题是:我们是否要把所有成员逐一复印?比如: derived.s1 = bas

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

class Base {
  string s1;
  string s2;
  ...
  string s100; // Hundreds of members
};

class Derived : public Base{
  string s101;
};
我想将基础对象
Base
分配给派生对象
Derived
。我知道我们不能只使用运算符“=”将基础对象分配给其派生对象。 我的问题是:我们是否要把所有成员逐一复印?比如:

derived.s1 = base.s1;
derived.s2 = base.s2;
...
derived.s100 = base.s100;
有没有更快或更简洁的方法?重载运算符=使用 返回的基本对象

我知道我们不能只使用操作符“=”将基础对象分配给它的 派生对象

当然你可以(在这个问题的背景下):

static_cast(派生)=base;
股票示例:

class Base {};

class Derived : public Base {};

void foo()
{
    Derived d;
    Base b;

    static_cast<Base &>(d)=b;
}
类基{};
派生类:公共基{};
void foo()
{
导出d;
碱基b;
静态_cast(d)=b;
}
我知道我们不能只使用运算符“=”将基础对象分配给其派生对象

那不是真的

我们必须把所有成员一份一份地复印吗?比如: base.s1=派生的base.s1; base.s2=派生的base.s2; ... base.s100=派生的0.s100

不是真的。正如Danh在第一条评论中提到的

base = derived 
这就足够了,因为它执行隐式动态向上转换(即从指针转换为派生到指针转换为基)。看

我要将基础对象基础指定给派生对象

为其提供重载
运算符=

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=derived?派生对象不在那里,我当时只有一个base对象作为数据源。我想创建一个新的派生对象,分配其成员并将其放入一个容器中,比如一个映射。那么为什么要编写'base.s1=derived.s1'呢?假设
base
支持分配给
base
),并且没有接受
派生的
运算符=()
,然后
base=derived
将起作用。请澄清您是否询问
base=derived,或
派生=基础谢谢,我会试试这个静态演员。然而,即使在这种情况下,这也是一种良好的做法吗?@M.M-不符合gcc 6.1.1:“t.C:12:4:错误:不匹配‘运算符=’(操作数类型为‘派生’和‘基’)”@SamVarshavchik足够公平
Base b;
// ...
Derived d;
// ...
d = b;