最近在工作中我遇到了这个代码(这是一个人为的例子,但从根本上做同样的事情):
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
类型的对象相同的所有成员变量。
在实际代码中,.panel {
z-index: 1000;
display: none;
background: #111;
box-sizing: border-box;
overflow: auto;
-webkit-overflow-scrolling: touch;
position: absolute;
width: 260px;
top: 0;
height: 100%;
-webkit-transform: translate3d(0,0,0);
transform: translate3d(0,0,0);
-webkit-transition-duration: .4s;
transition-duration: .4s;
}
有足够的变量,手动分配每个变量并不理想。
经过一段时间的努力,我能够理解代码在做什么,但事实上它花了我几秒钟似乎是一面红旗。
还有另一种方法来执行此代码正在执行的操作,这可能更容易理解,或者更符合C ++常见实践吗?看到以这种方式分配的变量是否常见?
编辑:有人建议我的问题可能是重复的,我问的是切片的对象是什么。这不是对象切片,因为我在任何时候都没有将派生类型的对象分配给基类型的对象。因此,代码中的任何地方都不会“切片”或丢失任何信息。
答案 0 :(得分:3)
我想说使用像这样的指针操作来进行赋值实际上在C ++中并不常见。
另一种方法是用演员表明明确表达你的意图。我不完全确定它是否更具可读性:
A a;
a.foo = 1000;
B b;
static_cast<A&>(b) = a;
根据您的具体需求,您可能会更好地使用子构造函数来获取父级并适当地构造自身。这样,您不需要默认构造子项,然后将父成员指定为第二步。
答案 1 :(得分:1)
如果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);
}