最近我在工作中发现了这段代码(这是一个人为的例子,但本质上是做同样的事情):
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++的常见实践?以这种方式赋值的变量常见吗?
编辑:有人建议我的问题可能是重复的,我问的是什么是对象切片。这不是对象切片,因为我在任何时候都没有将派生类型的对象分配给基类型的对象。因此,没有信息被“切片”或丢失在代码中的任何地方。
发布于 2017-07-17 15:38:15
我想说的是,使用这样的指针操作来进行赋值在C++中实际上并不常见。
另一种方法是通过强制转换明确地阐明您的意图。我不完全确定它是否更具可读性:
A a;
a.foo = 1000;
B b;
static_cast<A&>(b) = a;
但是,根据您的特定需求,最好使用子构造函数,该构造函数接受父构造函数并适当地构造自身。这样,您就不需要默认构造子对象,然后在第二步中分配父成员。
发布于 2017-07-17 16:35:43
如果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);
}
https://stackoverflow.com/questions/45148202
复制相似问题