在将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)
给出细分错误。任何的想法?
我以以下简单形式提出我的问题:
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 ++强制转换为派生类的方法,因此提到这种转换不是一种好习惯。由于模型中的猫和狗具有不同的行为特性,因此我不想将它们的定义放入动物模型中。另一方面,将它们分别存储在不同向量中将很难处理。有什么建议么?
为了在编译期间从模型中排除代码块,我将预处理器用作:
#ifdef setting1
do something
#endif //setting1
Run Code Online (Sandbox Code Playgroud)
有时我打算在编译过程中保留一段代码,但在运行时将其排除在外。if为此目的,有没有比声明更好的方法了?