c++ - 动态转换为派生类 : a strange case

标签 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;
        }
    }

出现段错误。有什么想法吗?

最佳答案

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

您正在测试名称是否等于“cat”,如果是,则动态转换为dogdynamic_cast 失败并返回 nullptr,这是预料之中的。

关于c++ - 动态转换为派生类 : a strange case,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57041321/

相关文章:

c++ - 关于C++中unsigned char类型的大小

php - 在 PHP 中更改父属性的值

javascript - 如何继承jQuery

c++ - 使用 "using"语法将标准容器成员方法引入其子类的范围对运算符不起作用

python - 指定泛型集合中重写方法的类型提示

python - Django ModelForm继承与Meta继承

c++ - 在代码中管理大量文本(并支持翻译)的最佳方式是什么?

c++ - 检查 CUDA 存在的程序需要 CUDA?

c++ - 为什么这段代码中调用了两次析构函数?

c++ - 写入共享内存队列时出现段错误