如何访问类型为子类的对象的重叠函数,该对象位于具有类

时间:2018-03-24 13:46:21

标签: c++ class inheritance subclass

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

一个单独的类C需要包含子类的不同实例,因此我在其中定义了一个带有A类模板的向量。问题是,当我尝试通过从C中的向量访问子类来运行foo时,它在A中运行空的foo版本,而不是从AA或AB中重写的版本。

如何在C中有一个向量,它可以包含子类的不同实例,并且能够运行被覆盖的foo版本?

如果您希望在代码中看到这些类 -

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,但我需要从正确的子类调用foo。

感谢您提供任何建议!

1 个答案:

答案 0 :(得分:1)

您需要将基类功能标记为虚拟。默认情况下,c ++方法是非虚拟的,因此foo()的所有实例都是完全独立的方法,恰好具有相同的名称。

如果您使用的是现代编译器,则还应使用override标记派生方法,以便编译器检查您是否真的覆盖了基类方法。

您也无法按向量中的值存储对象,而是需要存储指针,引用,unique_ptrshared_ptr。如果在向向量添加对象时按值存储,则会将其复制到A

类型的新对象中