首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何根据基类的对象中变量的值给派生类中的变量赋值?

如何根据基类的对象中变量的值给派生类中的变量赋值?
EN

Stack Overflow用户
提问于 2017-07-17 23:34:05
回答 2查看 83关注 0票数 1

最近我在工作中发现了这段代码(这是一个人为的例子,但本质上是做同样的事情):

代码语言:javascript
运行
复制
class A
{
public:
    int foo;
};

class B: public A
{
public:
    int bar;
};

int main()
{
    A a;
    a.foo = 1000;

    B b;
    A* a_ptr = &b;
    *a_ptr = a;
}

上面发生的情况是,a中的所有成员变量都被复制到b中相应的成员变量中,因为B是从A派生的,并且所有B类型的对象都保证至少具有与A类型的对象相同的所有成员变量。

在实际代码中,A有足够的变量,手动为每个变量赋值并不理想。

在与之斗争了一小段时间后,我能够理解代码在做什么,但我花了几秒钟多的时间似乎是一个危险信号。

有没有其他方法来做这段代码正在做的事情,可能更容易理解,或者更符合C++的常见实践?以这种方式赋值的变量常见吗?

编辑:有人建议我的问题可能是重复的,我问的是什么是对象切片。这不是对象切片,因为我在任何时候都没有将派生类型的对象分配给基类型的对象。因此,没有信息被“切片”或丢失在代码中的任何地方。

EN

回答 2

Stack Overflow用户

发布于 2017-07-17 23:38:15

我想说的是,使用这样的指针操作来进行赋值在C++中实际上并不常见。

另一种方法是通过强制转换明确地阐明您的意图。我不完全确定它是否更具可读性:

代码语言:javascript
运行
复制
A a;
a.foo = 1000;

B b;
static_cast<A&>(b) = a;

但是,根据您的特定需求,最好使用子构造函数,该构造函数接受父构造函数并适当地构造自身。这样,您就不需要默认构造子对象,然后在第二步中分配父成员。

票数 3
EN

Stack Overflow用户

发布于 2017-07-18 00:35:43

如果a_ptr只用作将A类成员分配给B对象的临时工具,并且以后的代码只使用b,我建议为B创建一个接受A对象的构造函数。如果没有别的,它提供了比目前更好的可读性。

代码语言:javascript
运行
复制
class A
{
public:
    int foo;
};

class B: public A
{
public:
    B(const A &a)
    {
       A* a_ptr = this;
       *a_ptr = a;
    }
    int bar;
};

int main()
{
    A a;
    a.foo = 1000;

    // Create B with copy of 'a' members
    B b(a);
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45148202

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档