通过引用C++中的基类来循环遍历派生类
Looping through the derived classes by referencing the base class in C++
很抱歉,如果以前有人问过这个问题,刚刚学习C++,曾尝试过搜索,但不确定关键字是什么。
有可能这样做吗?
class Car {
public:
void addColor(string c) {
color = c;
}
private:
string color;
}
class Honda:public Car {}
class Toyota:public Car {}
int main() {
vector<Car> v;
Honda *car1 = new Honda();
car1.addColor("green");
Toyota *car2 = new Toyota();
car2.addColor("blue");
v.push_back(car1);
v.push_back(car2);
for (int i = 0; i < v.size(); i++) {
cout << v[i].color << endl; // should output green, blue
}
}
如果可能的话,最正确/最有效的方法是什么?
编辑1
哇,谢谢大家!
您的向量始终保持基类型Car切片。查找"多态STL集合"多态向量"或类似内容,了解如何存储派生类。
这是一个的例子
有两种方法可以处理此问题。假设我们有以下类定义:
#include <string>
class Car {
public:
Car(const std::string& color) : color(color) {}
virtual ~Car() {}
std::string color;
};
class Honda:public Car {};
class Toyota:public Car {};
注意,我删除了setter,只是公开了该成员。你可能想要也可能不想要,但对于这个例子来说,这并不重要。这里有一种方法,可以分配堆栈上的所有内容,并获取这些对象的地址。在本例中,这很好(car1
和car2
不需要比main
函数更长寿)。在实际代码中,这可能不是真的(即,对象可能需要比创建它们的函数更长寿,请参阅下文):
#include <iostream>
#include <vector>
int main() {
Honda car1("green");
Toyota car2("blue");
std::vector<Car*> cars; // vector of non-owning pointers
v.push_back(&car1);
v.push_back(&car2);
for(auto& car : cars) {
std::cout << car.color << "n";
}
}
或者,在堆上分配对象:
int main() {
std::vector<std::unique_ptr<Car>> cars; // vector of owning pointers
v.emplace_back(new Honda("green"));
v.push_back(new Toyota("blue"));
for(auto& carptr : cars) {
std::cout << carptr->color << "n";
}
}
你走在正确的道路上,只有一些小问题需要解决:
- 将getter添加到基类(
Car
) - 更改矢量类型(为
vector<Car*>
) - 需要时,用
a->b
替换a.b
- 修复类定义后缺少分号的问题
给你:
#include <iostream>
#include <vector>
using namespace std;
class Car {
public:
virtual ~Car ();
void addColor(string c) {
color = c;
}
string getColor () {
return color;
}
private:
string color;
};
class Honda:public Car {};
class Toyota:public Car {};
int main() {
vector<Car*> v;
Honda car1;
car1.addColor("green");
Toyota car2;
car2.addColor("blue");
v.push_back(&car1);
v.push_back(&car2);
for (int i = 0; i < v.size(); i++) {
cout << v[i]->getColor () << endl; // should output green, blue
}
}
顺便说一句,如果你想让你的子类有自己的方法来处理颜色,只需在car类中将这些方法声明为virtual
,你就可以在子类中重新定义它。
还有一点。你不能使你的向量是vector<Car>
。因为子类的大小可能与母类的大小不同(想象一下,将int appeal;
添加到Honda
类中),因为向量只能存储大小相同的元素。
相关文章:
- 为什么即使使用 for 循环遍历我的向量,它也没有输出到控制台?(C++)
- 循环遍历标准的正确方法::array<char*, N>
- 我该如何循环遍历我的数组(缓冲区——包含一个文本文件),并将其打印成30字节的块
- 如何在重复循环中循环遍历 std::vector
- 数组 - 循环遍历辅助阵列
- 在C++中循环遍历二维数组时改进 O(n)
- 如何在 uwp c# 中循环遍历和检查 Xbox 控制器状态
- 循环遍历向量<string>并保持每个元素"count"时出现问题
- IOS objective-C 循环遍历 2 个数组
- 循环遍历地图时编译错误
- 在C 中的字符串向量的字符串元素中循环遍历所有字符
- 如何使用单 for 循环遍历 std::map<string>int 和 std::vector<int>?
- 循环遍历向量中的所有(无序)元素对
- 使用循环遍历三角形内的所有点
- 循环遍历CreateProcess输出的每一行
- 如何在指针表示法和数组表示法中循环遍历二维数组
- 使用 'for' 循环遍历C++向量
- 链表的循环遍历
- 在C++中循环遍历一个3d索引的1d数组
- 在循环遍历矢量时将对象添加到矢量