static_cast没有达到我的期望

时间:2018-06-30 17:36:16

标签: c++ dynamic-cast static-cast

我正在尝试将继承类型的对象存储到std :: deque数组中。

我成功存储了元素,但是当我尝试使用它们时,仅保留了父属性。

enum Family { parent_, child_};

class Parent {

public:

    double a;

    Family type;

    Parent(double a_, Family type_=Family::parent_) {
        a = a_;
        type = type_;
    }

    void print() {
        std::cout << "I am the parent. a:" << a << std::endl;
    }

};


class Children: public Parent {

public:

    double b;
    double c;

    Children(double a_, double b_, double c_) : Parent(a_, Family::child_) {        
        b = b_;
        c = c_;
    }

    void print() {
        std::cout << "I am the children. a:" << a << ", b:" << b << ", c:" << c << std::endl;
    }
};


void class_inheritance_test() {

    std::deque<Parent> vec;

    vec.push_back(Parent(1.0));
    vec.push_back(Parent(2.0));
    vec.push_back(Children(10.0, 20.0, 30.0));

    for (Parent &e : vec)
        if (e.type == Family::child_){
            Children* ch = static_cast<Children*>(&e);
            ch->print();
        } else {
            e.print();
        }       
}

这段代码的输出是:

I am the parent. a:1
I am the parent. a:2
I am the children. a:10, b:0, c:-1.30018e-231

很明显,当我将子级作为父级从其存储中回退时,Children类中定义的属性会丢失。

我看到问题出在我存储对象的方式还是将它们投射回它们应该属于的类的方式。

我希望您能获得一些有关如何在向量中存储多种类型的对象并能够重新使用它们的指导。我看到的其他示例不包含属性,对于我的问题,我必须具有属性。

编辑------------------------------

对于将来的用户,解决方案是使用shared_ptr

void class_inheritance_test() {

    std::deque<std::shared_ptr<Parent>> vec;

    vec.push_back(std::make_shared<Parent>(1.0));
    vec.push_back(std::make_shared<Parent>(2.0));
    vec.push_back(std::make_shared<Children>(10.0, 20.0, 30.0));

    for (std::shared_ptr<Parent> e : vec)
        if (e->type == Family::child_){
            std::shared_ptr<Children> ch = std::static_pointer_cast<Children>(e);
            ch->print();
        } else {
            e->print();
        }       
}

输出正是预期的结果:

I am the parent. a:1
I am the parent. a:2
I am the children. a:10, b:20, c:30

0 个答案:

没有答案