已关注 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;
}
}
出现段错误。有什么想法吗?
最佳答案
if (barnyard[ii]->get_name()=="cat")
auto dogptr = dynamic_cast<dog*>(barnyard[ii]);
您正在测试名称是否等于“cat”
,如果是,则动态转换为dog
。 dynamic_cast
失败并返回 nullptr,这是预料之中的。
关于c++ - 动态转换为派生类 : a strange case,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57041321/