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

Quickly assign all the members of a base object to a derived object in C++

提问人:Emerson Xu 提问时间:9/26/2016 最后编辑:songyuanyaoEmerson Xu 更新时间:9/26/2016 访问量:68

问:

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

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

class Derived : public Base{
  string s101;
};

我想将 Base 对象分配给 Derived 对象。我知道我们不能只使用运算符“=”将基本对象分配给其派生对象。 我的问题是:我们是否必须将所有成员一一复制?喜欢:basederived

derived.s1 = base.s1;
derived.s2 = base.s2;
...
derived.s100 = base.s100;

有没有更快或更简洁的方法可以做到这一点?重载运算符= 返回的基本对象?

C++ 继承 赋值运算符

评论

1赞 Danh 9/26/2016
base = 派生?
0赞 Emerson Xu 9/26/2016
派生对象不存在,我当时只有一个基本对象作为数据源。我想创建一个新的派生对象,分配其成员并将其放在一个容器中,比如一个映射。
1赞 Danh 9/26/2016
那你为什么要写'base.s1 = derived.s1'
0赞 Peter 9/26/2016
假设支持赋值到 ) 并且没有接受 的 ,那么将起作用。BaseBaseoperator=()Derivedbase=derived
0赞 M.M 9/26/2016
请澄清您是在问 ,还是base = derived;derived = base;

答:

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;