如何在C++中将多个子类的对象存储在一个向量中

How to store objects of multiple subclasses in a vector in C++

本文关键字:存储 向量 对象 一个 子类 C++      更新时间:2023-10-16

我正在尝试创建任何可迭代的子类对象来存储在.中

我目前正在使用指向超类的指针向量,但这似乎不允许使用任何特定于子类的声明。

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(),而不检查子类中是否有更精细的版本。如果您有一个虚拟方法,编译器会确定它应该查看对象,以根据其类型来确定要调用哪个方法。您需要更改piecepawn:中foo的声明

piece中的
  • virtual int foo()
  • CCD_ 10在CCD_

请参阅"为什么我们需要C++中的虚拟函数?"。用Kenneth Worden的话来说,"virtual允许调用子类方法,即使对象被视为其超类"。