动态转换为派生类:一个奇怪的情况

时间:2019-07-15 13:56:36

标签: c++ inheritance

C++ cast to derived class之后,我遇到了一些奇怪的事情。这是问题的简化:

class animal{
public:
    animal(){
        _name="animal";
    }
    virtual void makenoise(){
        cout<<_name<<endl;
    }
    T get_name(){
        return _name;
    };
protected:
    T _name;
};

class cat:public animal{
public:
    cat(){
        this->_name="cat";
    }
private:
};

class dog:public animal{
public:
    dog(){
        this->_name = "dog";
    }
};

如果我按照以下方式进行动态投射,则可以正常工作。

vector<animal*> barnyard;
barnyard.push_back(new animal());
barnyard.push_back(new dog());
barnyard.push_back(new cat());
dog* dogptr = dynamic_cast<dog*>(barnyard[1]);
barnyard[1] = dogptr;
cout<<barnyard[1]->get_name()<<endl;

但是可以通过以下方式进行:

 for (int ii=0;ii<3;ii++) {
        if (barnyard[ii]->get_name()=="cat"){
            auto dogptr = dynamic_cast<dog*>(barnyard[ii]);
            barnyard[ii] = dogptr;
            cout<<barnyard[ii]->get_name()<<endl;
        }
    }

给出分段错误。有想法吗?

1 个答案:

答案 0 :(得分:5)

if (barnyard[ii]->get_name()=="cat")
    auto dogptr = dynamic_cast<dog*>(barnyard[ii]);

您要测试的名称等于"cat",如果是,则正在动态广播到dogdynamic_cast失败并返回nullptr,这是我们所期望的。