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

Jal*_*isa 2 c++ inheritance

在将C ++强制转换为派生类之后,我遇到了一些奇怪的事情。这是问题的简化:

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";
    }
};
Run Code Online (Sandbox Code Playgroud)

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

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;
Run Code Online (Sandbox Code Playgroud)

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

 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;
        }
    }
Run Code Online (Sandbox Code Playgroud)

给出细分错误。任何的想法?

Soo*_*nts 5

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

您正在测试名称等于"cat",如果是,则正在动态广播到dogdynamic_cast失败并返回nullptr,这是完全可以预期的。

  • @Slava显然是后来的事。我已经解释了OP的两个代码段之间的区别,为什么第一个有效,而第二个无效。在第一个中,他们正在投射`barnyard [1]`这是一条狗。猫在向量中的索引为[[2]`。 (2认同)