如何在C++中将多个子类的对象存储在一个向量中
How to store objects of multiple subclasses in a vector in C++
我正在尝试创建任何可迭代的子类对象来存储在.中
我目前正在使用指向超类的指针向量,但这似乎不允许使用任何特定于子类的声明。
class piece
{
public:
int foo()
{
return 1;
}
};
class pawn : public piece
{
public:
int foo()
{
return 2;
}
};
std::vector<piece*> pieces;
pieces.push_back(new pawn());
pieces[0]->foo(); // returns 1 though pieces[0] should be a pawn
对pieces[0]->foo()的调用返回1,而我希望它返回2。
调试显示"new pawn()"创建了一个工件指针,所以我明白为什么它不使用pawn函数,但我不知道为什么它一开始就不是pawn。
这是因为您的foo
方法不是virtual
。在其他几种面向对象的语言中,默认情况下,所有方法都是"虚拟的",但它们不是C++中的。"虚拟"意味着要调用的函数是在运行时确定的。当您有一个非虚拟方法时,编译器会在编译时根据静态类型信息决定调用哪个函数。
在这种情况下,由于您有一个piece
的向量,编译器总是确定它应该调用pieces[0]->piece::foo()
,而不检查子类中是否有更精细的版本。如果您有一个虚拟方法,编译器会确定它应该查看对象,以根据其类型来确定要调用哪个方法。您需要更改piece
和pawn
:中foo
的声明
piece
中的virtual int foo()
- CCD_ 10在CCD_
请参阅"为什么我们需要C++中的虚拟函数?"。用Kenneth Worden的话来说,"virtual允许调用子类方法,即使对象被视为其超类"。
相关文章:
- 访问存储在向量C++中的结构的多态成员
- 添加存储在向量中的大整数的函数出现问题
- 在 std::无符号字符的向量处存储 int 的十六进制表示形式
- 如何从用户那里获取输入并将其存储在向量中?
- 如何从文件中读取两个字符串和数字数组,并将它们存储在对象向量中
- 将无符号字符的向量存储在数组中会给我 std::bad_alloc
- 在二维向量或数组中可以存储的最大元素数是多少?
- 存储在堆分配向量中的指针的免费存储
- 将相同共享指针的副本存储在不同的向量中是否是一种好的做法?
- 将数组信息存储到 c++ 向量中有一个"Access violation reading location"
- Sqlite3:将数据库表名存储在向量中
- 如何在数组和向量 c++ 中存储和保存输入
- C++ 将抽象类型的动态分配对象传递给函数并存储在向量中
- 是否可以在类中存储unique_ptr,并在C++中存储向量?
- 在向量 C++14(无限制联合)的结构内的联合中创建和存储字符串
- 在固定大小的向量中存储指向元素的指针
- 无法将派生类存储在基类指针的向量中
- 如何访问和存储向量类型的结构成员
- 如何按索引存储向量的向量
- findnonzero() 中存储向量<Point>中非零元素的坐标时出错