如何根据基类对象中的变量值分配派生类中的变量?



>最近在工作中,我遇到了这段代码(这是一个人为的例子,但基本上在做同样的事情(:

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++常见做法?以这种方式分配的变量是否常见?

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

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

另一种方法是用演员表明确说明您的意图。我不完全确定它是否更具可读性:

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

但是,根据您的特定需求,使用子构造函数可能会更好地满足您的需求,该子构造函数采用父构造函数并适当地构造自身。这样,您就不需要默认构造子成员,然后在第二步分配父成员。

如果a_ptr除了临时将A类成员分配给B对象并且以后的代码仅使用b之外没有其他目的,我建议为B创建一个构造函数,该构造函数采用A对象。如果没有别的,它提供了比当前更好的可读性。

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);
}

最新更新