小编Jal*_*isa的帖子

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

在将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)

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

c++ inheritance

2
推荐指数
1
解决办法
94
查看次数

动态转换派生类的需求:寻找替代方法

我以以下简单形式提出我的问题:

class animal {
public:
    animal() {
        _name="animal";
    }

    virtual void makenoise(){
        cout<<_name<<endl;
    }

    string get_name(){
        return _name;
    }

protected:
    string _name;
};

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

class dog : public animal {
public:
    dog() {
        this->_name = "dog";
    }
};
Run Code Online (Sandbox Code Playgroud)

我想将所有动物类型一起存储在单个容器中,例如:

vector<animal*> container;
barnyard.push_back(new animal());
barnyard.push_back(new dog());
barnyard.push_back(new cat());
Run Code Online (Sandbox Code Playgroud)

在代码的某个时刻,我需要将dog对象转换为cat对象。我需要进行的转换是设置一个新的dog对象,并用与cat对应的对象相同的索引号替换它。据我了解,dynamic_cast在这种情况下不起作用,并且基于将C ++强制转换为派生类的方法,因此提到这种转换不是一种好习惯。由于模型中的猫和狗具有不同的行为特性,因此我不想将它们的定义放入动物模型中。另一方面,将它们分别存储在不同向量中将很难处理。有什么建议么?

c++ polymorphism inheritance

2
推荐指数
1
解决办法
93
查看次数

如何在运行时有效地排除代码块

为了在编译期间从模型中排除代码块,我将预处理器用作:

#ifdef setting1
do something
#endif //setting1
Run Code Online (Sandbox Code Playgroud)

有时我打算在编译过程中保留一段代码,但在运行时将其排除在外。if为此目的,有没有比声明更好的方法了?

c++ preprocessor

1
推荐指数
1
解决办法
62
查看次数

标签 统计

c++ ×3

inheritance ×2

polymorphism ×1

preprocessor ×1