在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;
}
}
给出分段错误。有想法吗?
答案 0 :(得分:5)
if (barnyard[ii]->get_name()=="cat")
auto dogptr = dynamic_cast<dog*>(barnyard[ii]);
您要测试的名称等于"cat"
,如果是,则正在动态广播到dog
。 dynamic_cast
失败并返回nullptr,这是我们所期望的。