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

时间:2017-07-17 15:34:05

标签: c++ oop polymorphism

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

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 ++常见实践吗?看到以这种方式分配的变量是否常见?

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

2 个答案:

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