如何访问模板为 class 的向量中类型为 subclass 的对象的覆盖函数

How to access the overidden function of an object of type subclass which is in a vector with a template of class

我有一个 class A,它定义了一个空函数 foo,等等。 两个subclass继承自A,AA和AB。这两个都以不同的方式覆盖 foo。

一个单独的 class,C,需要保存子 classes 的不同实例,所以我定义了一个向量,其中包含 class A 的模板。问题是,当我尝试通过从 C 中的向量访问 subclass 来 运行 foo 时,它 运行s 是 A 中 foo 的空版本,而不是来自AA 或 AB。

我怎样才能在 C 中拥有一个 vector,它可以容纳 subclasses 的不同实例并能够 运行 foo 的覆盖版本?


如果您希望在代码中看到 classes -

A

class A
{
public:
    A();
    foo() {}
};

AA

class AA : public A
{
public:
    AA();
    foo() { //does something else }
};

AB

class AB : public A
{
public:
    AB();
    foo() { //does a different something else }
};

C

class C
{
public:
    C();

private:
    std::vector<A> things;
};

在 C 中,如果我尝试 运行 things.at(x).foo() 它会调用 A 中的 foo,但我需要从正确的子 class.[=16 中调用 foo =]

感谢您提供的任何建议!

您需要将基础 class 函数标记为虚拟函数。默认情况下,C++ 方法是 non-virtual,所以你所有的 foo() 实例都是完全独立的方法,它们恰好具有相同的名称。

如果您使用的是现代编译器,您还应该使用 override 标记您的派生方法,让编译器检查您是否确实覆盖了基础 class 方法。

您也不能在向量中按值存储对象,您需要存储指针、引用、unique_ptrshared_ptr。如果在将对象添加到向量时按值存储,它将被复制到 A

类型的新对象中