c++多态性:基类的上转换/下转换和容器,缺少数据
c++ polymorphism: upcasting/re-downcasting and containers of base class, missing data
我正在尝试用派生的动物类(狗、猫等)填充向量。当我取出向量的内容时,我想将它们向下转换回派生类。
在完成dog.setLegs(4)之后,我将使用getLegs()返回正确的腿数。然而,在从animals向量中获取Animal对象并将其投射回类型Dog之后,mydog->getLegs()将返回0,而不是我预期的4。
我想我在这里做错了什么,但我不确定是什么。有人能帮我吗?谢谢
class Animal{
};
class Dog : public Animal {
public:
void setLegs(int newLegs){legs = newLegs;};
int getLegs(){return legs;};
protected:
int legs=0;
};
int main(int argc, char* argv[]){
Dog dog;
dog.setLegs(4);
std::cout<<dog.getLegs()<<std::endl;
std::vector<Animal> animals;
animals.push_back(dog);
Dog *mydog = (Dog*) &(animals[0]);
std::cout<<mydog->getLegs()<<std::endl;
return 0;
}
您的std::vector
只包含Animal
s。将Animal
的子类放入向量中会"切片"子类,只在向量中保留Animal
。子类已不存在。已经没有了。
您要做的是存储指向Animal
的指针:
std::vector<Animal *> animals;
因此,代码的相关部分变成:
Dog *mydog = (Dog*)animals[0];
std::cout<<mydog->getLegs()<<std::endl;
相关文章:
- 防止主数据类型C++的隐式转换
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 从矢量<无符号字符>转换为字符* 包括垃圾数据
- 如何在C++中将十六进制字符串转换为文本数据
- 将复杂的非基元C++数据类型转换为 Erlang/Elixir 格式,以使用 NIF 导出方法
- 从'size_t'转换为"常量双倍",可能会丢失数据
- 将传入的网络"char*"数据转换为"uint8_t"并返回的安全方法是什么?
- Static_cast转换为错误的数据类型,但结果仍然正确?
- 使用带有链表的堆栈数据结构将中缀转换为后缀
- PyTorch C++将数据转换为张量失败
- 使用从文件(stod、strtod、atof)中提取的数据C++从字符串转换为双精度.csv
- 虚拟成员函数的定义是否强制在同一转换单元中动态初始化静态数据成员?
- 如何使用 dart:ffi 将 Uint8List 转换为 C 等效数据类型
- 如何索引转换后的用户数据值?
- 使用 OpenCV 和 Android NDK 转换数据格式
- 如何转换数据结构以在 c++ 中转换字符*
- C++读取文件并转换数据
- 在C++中为C库强制转换数据类型
- 在C++中,关于位移和强制转换数据类型
- 最有效的方式转换数据帧到矩阵,反之亦然